探究Java的磁盘写入神器:OutputStream详解

咦咦咦,各位小可爱,我是你们的好伙伴------bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

js 复制代码
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

在Java开发中,我们往往需要将程序中生成的数据或者结果保存在磁盘文件中,这时我们就需要使用到Java的输入输出流。

在输入输出流中,OutputStream是Java中最为常用的输出流,它能够将数据流输出到目标设备中,例如磁盘文件、网络等。

本文将对Java中的OutputStream进行详细介绍,包括它的作用、使用方法、源代码等内容,帮助读者更好地掌握这一重要的输出流。

摘要

本文主要介绍了Java中的OutputStream,包括它的作用、使用方法、源代码等内容。具体而言,本文将从以下几个方面进行介绍:

  1. OutputStream的概述和作用;
  2. OutputStream的使用方法,包括如何创建OutputStream对象、如何使用OutputStream输出数据、如何关闭OutputStream
  3. OutputStream的源代码分析;
  4. 演示代码和测试用例;
  5. 小结和总结。

OutputStream

概述和作用

OutputStream是Java中的一个抽象类,它是所有输出流的父类,用于写入数据流到目标设备中。OutputStream提供了一系列的方法,可以用于输出不同类型的数据到目标设备中。

OutputStream的主要作用包括:

  1. 写入二进制数据:OutputStream可以将二进制数据流写入到目标设备中,例如将图片、视频等二进制文件写入到磁盘文件中;
  2. 写入字符数据:OutputStream可以将字符数据流写入到目标设备中,例如将字符串写入到文本文件中;
  3. 写入网络数据:OutputStream可以将网络数据流写入到目标设备中,例如将数据发送给服务器。

使用方法

创建OutputStream对象

在Java中,OutputStream是一个抽象类,不能直接被实例化。因此,我们需要使用其子类来创建OutputStream对象。

常用的OutputStream子类有FileOutputStreamByteArrayOutputStreamDataOutputStream等。下面以FileOutputStream为例,介绍如何创建OutputStream对象:

java 复制代码
FileOutputStream outputStream = new FileOutputStream("./template/hello.txt");

上述代码创建了一个名为./template/hello.txt的文件输出流,它将数据流写入到磁盘文件中。

使用OutputStream输出数据

OutputStream提供了一系列方法,可以用于输出不同类型的数据到目标设备中。例如,可以使用write()方法将字节数组写入到磁盘文件中:

java 复制代码
byte[] data = "Hello, OutputStream!".getBytes();
outputStream.write(data);

除了write()方法,OutputStream还提供了很多其他方法,可以用于输出不同类型的数据。例如,write(byte[] b, int off, int len)方法可以将字节数组部分内容写入到磁盘文件中。

关闭OutputStream

在使用OutputStream写入数据时,为了保证数据的完整性和可靠性,需要及时关闭OutputStream。可以使用close()方法关闭输出流对象:

java 复制代码
outputStream.close();

源代码分析

在Java中,OutputStream是一个抽象类,包路径为:java.io.OutputStream

其源代码如下:

java 复制代码
public abstract class OutputStream implements Closeable, Flushable {
    //...
    public abstract void write(int b) throws IOException;
    public void write(byte[] b) throws IOException {
        write(b, 0, b.length);
    }
    public void write(byte[] b, int off, int len) throws IOException {
        if ((off < 0) || (off > b.length) || (len < 0) ||
            ((off + len) > b.length) || ((off + len) < 0)) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return;
        }
        for (int i = 0 ; i < len ; i++) {
            write(b[off + i]);
        }
    }
    //...
}

OutputStream 中有三个抽象方法未实现,write(int b)flush()close(),同时它还实现了 write(byte[] b)write(byte[] b, int off, int len) 这两个方法。

  • write(int b) 方法是用来向输出流中写入单个字节(b 的低 8 位)。它是一个抽象方法,需要被子类实现。

  • write(byte[] b) 方法是将 byte 数组 b 的所有字节写入到输出流中。它调用了 write(byte[] b, int off, int len) 方法,这个方法是将 byte 数组 b 中从偏移量 off 开始的 len 个字节写入输出流中。在实现这个方法的时候,它遍历了 byte 数组中的所有字节,并调用了 write(int b) 方法将每个字节写入输出流中。

  • flush() 方法用来将缓冲区中的数据写出到输出流中,这个方法是一个空实现方法,具体实现需要由子类实现。

  • close() 方法用来关闭输出流并释放与之相关的资源。这个方法同样是一个空实现方法,具体实现需要由子类实现。

其源码部分截图如下所示:

总之,OutputStream 是所有输出流的基类,它定义了输出流的基本特性,并提供了一些常用的方法,如写入单个字节、写入字节数组等。任何继承自 OutputStream 的子类都需要实现它的抽象方法,以便正确地实现其功能。

测试用例

以下是一个简单的示例代码,演示了如何使用OutputStream将字符串写入到磁盘文件中:

测试用例代码

java 复制代码
package com.example.javase.io.outputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @Author bug菌
 * @Date 2023-10-15 19:13
 */
public class OutputStreamTest {

    public static void main(String[] args) throws IOException {
        String str = "Hello, jym!";
        byte[] data = str.getBytes();
        OutputStream outputStream = null;

        try {
            outputStream = new FileOutputStream("./template/hello.txt");
            outputStream.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}

测试代码解析

这是一个使用Java的输出流(OutputStream)将字符串输出到本地文件的例子。具体解析如下:

  1. 定义字符串
java 复制代码
String str = "Hello, jym!";
  1. 将字符串转换为字节数组
java 复制代码
byte[] data = str.getBytes();
  1. 创建输出流对象
java 复制代码
OutputStream outputStream = null;
try {
    outputStream = new FileOutputStream("./template/hello.txt");
} catch (IOException e) {
    e.printStackTrace();
}

这里使用了Java的文件输出流(FileOutputStream),将数据输出到本地文件。./template/hello.txt表示本地文件的路径,如果文件不存在则会创建文件。如果创建失败则会抛出IOException。

  1. 写入数据
java 复制代码
outputStream.write(data);

将字节数组写入输出流中。

  1. 关闭流
java 复制代码
if (outputStream != null) {
    outputStream.close();
}

为了防止资源泄漏,需要在使用完输出流后关闭它。这里使用了Java的异常处理机制,在代码中使用try-catch-finally语句块。

测试结果

根据测试用例执行结果如下:

小结

本文详细介绍了Java中的OutputStream,包括它的作用、使用方法、源代码等内容。具体而言,本文介绍了OutputStream的概述和作用,以及如何创建OutputStream对象、使用OutputStream输出数据和关闭OutputStream等内容。

同时,本文还给出了一个简单的演示代码和测试用例,帮助读者更好地掌握OutputStream的使用。

总结

OutputStream是Java中最常用的输出流之一,它能够将数据流输出到目标设备中,例如磁盘文件、网络等。在使用OutputStream时,需要注意及时关闭输出流对象,避免数据的丢失或不完整。当需要将程序中生成的数据或结果输出到磁盘文件中时,可以使用OutputStream来完成。

... ...

ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。

「赠人玫瑰,手留余香」,咱们下期拜拜~~

附录源码

如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


相关推荐
顽疲2 分钟前
从零用java实现 小红书 springboot vue uniapp(13)模仿抖音视频切换
java·vue.js·spring boot
星辰离彬24 分钟前
Java 与 MySQL 性能优化:MySQL连接池参数优化与性能提升
java·服务器·数据库·后端·mysql·性能优化
半桔24 分钟前
【Linux手册】从接口到管理:Linux文件系统的核心操作指南
android·java·linux·开发语言·面试·系统架构
nightunderblackcat33 分钟前
新手向:实现ATM模拟系统
java·开发语言·spring boot·spring cloud·tomcat·maven·intellij-idea
超级小忍37 分钟前
Spring Boot 与 Docker 的完美结合:容器化你的应用
spring boot·后端·docker
Bug退退退12338 分钟前
RabbitMQ 高级特性之延迟队列
java·spring·rabbitmq·java-rabbitmq
先睡42 分钟前
RabbitMQ
java
笑衬人心。43 分钟前
Java 17 新特性笔记
java·开发语言·笔记
麦兜*2 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud