首页 > 编程笔记 > Java笔记 阅读:40

Java字节流InputStream和OutputStream详解(附带实例)

在 Java 中,I/O 流(输入/输出流)是用于进行数据输入和输出的机制。

I/O 流是 Java 程序与外部设备(如文件、网络、控制台等)进行数据交互的重要方式。通过 I/O 流,我们可以从外部设备读取数据到程序中,也可以将程序中的数据输出到外部设备。

Java 的 I/O 流以字节流和字符流两种方式进行数据的传输。其中,字节流以字节为单位进行数据传输,用于处理二进制数据或字节数据,适用于处理图片、音频、视频等文件。字节流主要由 InputStream 类和 OutputStream 类及其子类组成。

Java字节流

1) 字节输入流

字节输入流的根类是 InputStream,如下图所示。


图 1 字节输入流类的继承层次

InputStream 有很多子类,这些类的说明如下表所示:

表:主要的字节输入流
描述
FileInputStream 文件输入流
ByteArrayInputStream 面向字节数组的输入流
PipedInputStream 管道输入流,用于两个线程之间的数据传递
FilterInputStream 过滤输入流,它是一个装饰器,用于扩展其他输入流
BufferedInputStream 缓冲区输入流,它是 FilterInputStream 的子类
DataInputStream 面向基本数据类型的输入流

InputStream 定义了很多方法,影响着字节输入流的行为,主要方法如下:

2) 字节输出流

字节输出流的根类是 OutputStream,如下图所示:


图 2 字节输出流类的继承层次

OutputStream 有很多子类,这些类的说明如下表所示:

表:主要的字节输出流
描述
FileOutputStream 文件输出流
ByteArrayOutputStream 面向字节数组的输出流
PipedOutputStream 管道输出流,用于两个线程之间的数据传递
FilterOutputStream 过滤输出流,它是一个装饰器,用于扩展其他输出流
BufferedOutputStream 缓冲区输出流,它是 FilterOutputStream 的子类
DataOutputStream 面向基本数据类型的输出流

OutputStream 定义了很多方法,影响着字节输出流的行为,主要方法如下。
上述所有方法都声明了抛出异常 IOException,因此使用时要注意处理异常。

流(包括输入流和输出流)所占用的资源不能通过 Java 虚拟机的垃圾收集器回收,需要程序员自己释放:

Java字节流复制二进制文件

复制文件时数据源是文件,所以会用到文件输入流 FileInputStream;数据目的地也是文件,所以会用到文件输出流 FileOutputStream。

FileInputStream 和 FileOutputStream 中的主要方法都继承自 InputStream 和 OutputStream。

FileInputStream 的构造方法如下:
2. FileOutputStream的构造方法
接下来实现将当前项目的 data 目录下的“漫画Java.png”文件内容复制为“漫画Java-副本.png”。参考代码如下:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

// Main 类
public class BinaryFileCopier {
    public static void main(String args[]) {
        try (FileInputStream in = new FileInputStream("data/漫画 Java.png");
             FileOutputStream out = new FileOutputStream("data/漫画 Java - 副本.png")) { // ①
            // 准备一个缓冲区
            byte[] buffer = new byte[1024]; // ②
            // 首先读取一次
            int len = in.read(buffer); // ③
            while (len != -1) { // ④
                // 开始写入数据
                out.write(buffer, 0, len); // ⑤
                // 再读取一次
                len = in.read(buffer); // ⑥
            }
        } catch (FileNotFoundException e) {
            System.out.println("复制失败! 文件没有发现!");
        } catch (IOException e) {
            System.out.println("复制失败!");
        }
        System.out.println("复制完成。");
    }
}
若这段代码成功运行,会实现文件复制,下面解释一下代码:

相关文章