InputStream 是 Java 字节输入流抽象父类,定义统一读取接口,核心方法为 read()、read(byte[]) 和 read(byte[], int, int),使用需处理 IOException、显式关闭流或用 try-with-resources,并注意中文需显式指定字符编码。
InputStream 是 Java 中所有字节输入流的抽象父类,位于 java.io 包中。它不直接创建实例,而是定义了从数据源(如文件、内存、网络等)按字节读取二进制数据的基本行为和统一方法。它的核心设计目标是“以字节为单位
读取”,因此适用于任意类型文件——文本、图片、音频、视频等,只要底层是二进制格式。
它提供了一套标准接口,让不同来源的数据读取方式保持一致。比如:
所有这些子类都继承 InputStream,并重写其 read() 方法来适配各自的数据源。
这三个方法是实际编码中最常调用的,理解它们的区别能避免常见错误:
int read():每次读 1 个字节,返回值是 int 类型(0–255),读到末尾返回 -1。适合小文件或逐字节解析场景,但效率低,不推荐用于大文件。int read(byte[] b):尝试把最多 b.length 个字节读入数组 b,返回实际读取的字节数;读到末尾也返回 -1。这是最常用的方式,需注意返回值才是有效数据长度,不能直接把整个数组当字符串用。int read(byte[] b, int off, int len):从数组索引 off 处开始,最多存 len 个字节。适合循环读取时复用缓冲区、避免频繁新建数组,例如配合 while 循环分块处理大文件。哪怕只是读一个文件,这几个细节出错就容易导致程序异常或资源泄漏:
close() 释放系统句柄(如文件描述符)。未关闭可能导致文件被占用、内存泄漏,甚至 JVM 资源耗尽。try (FileInputStream fis = new FileInputStream("data.bin")) {
int len = fis.read(buffer);
} —— 不用手动 close,也无需 finally 块。new String(bytes, 0, len, "UTF-8") 显式指定编码,否则默认平台编码可能出错。三步走,缺一不可:
不复杂但容易忽略。