Java InputStream 类
InputStream 是 Java I/O 系统中用于读取字节数据的抽象基类,位于 java.io
包中。
InputStream 是所有字节输入流的父类,为读取字节数据提供了基本框架。
InputStream 是一个抽象类,这意味着你不能直接实例化它,但可以通过它的子类(如 FileInputStream、ByteArrayInputStream 等)来创建具体的输入流对象。
核心方法解析
读取单个字节
这是 InputStream 中最基本的方法,用于从输入流中读取下一个字节的数据。返回值为 0 到 255 之间的 int 值,如果到达流的末尾则返回 -1。
示例代码
实例
int data = input.read();
while(data != -1) {
System.out.print((char)data);
data = input.read();
}
input.close();
读取字节数组
实例
这个方法尝试读取最多 b.length 个字节的数据到字节数组中,返回实际读取的字节数,如果到达流的末尾则返回 -1。
示例代码
实例
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = input.read(buffer)) != -1) {
System.out.println("Read " + bytesRead + " bytes");
}
input.close();
读取指定长度的字节
实例
这个方法允许你指定从哪个位置开始存储读取的数据(off),以及最多读取多少字节(len)。
示例代码
实例
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer, 10, 500); // 从buffer[10]开始存储,最多读500字节
input.close();
跳过字节
实例
跳过并丢弃输入流中的 n 个字节数据,返回实际跳过的字节数。
检查可用字节
实例
返回可以从此输入流中读取(或跳过)的估计字节数,而不阻塞。
2.6 关闭流
实例
关闭输入流并释放与之关联的所有系统资源。这是一个非常重要的方法,应该在完成流操作后调用。
常用子类介绍
- FileInputStream: 用于从文件中读取数据。
- ByteArrayInputStream: 允许内存中的字节数组作为输入流。
- FilterInputStream: 为其他输入流提供额外功能的装饰器类。
- ObjectInputStream: 用于反序列化之前使用 ObjectOutputStream 序列化的对象。
- PipedInputStream: 与 PipedOutputStream 配合使用,实现线程间的管道通信。
最佳实践
使用 try-with-resources
Java 7 引入了 try-with-resources 语句,可以自动关闭实现了 AutoCloseable 接口的资源。
实例
int data;
while ((data = input.read()) != -1) {
System.out.print((char)data);
}
} catch (IOException e) {
e.printStackTrace();
}
缓冲读取提高性能
对于大文件或频繁的读取操作,建议使用 BufferedInputStream 包装以提高性能。
实例
// 读取操作
} catch (IOException e) {
e.printStackTrace();
}
正确处理异常
IO 操作可能会抛出 IOException,应该妥善处理这些异常。
5. 常见问题解答
为什么 read() 方法返回 int 而不是 byte?
因为需要有一个特殊值(-1)来表示流的结束,而 byte 类型无法表示-1。
如何将 InputStream 转换为 String?
实例
try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
return stringBuilder.toString();
}
}
如何复制 InputStream?
InputStream 通常只能读取一次,如果需要多次读取,可以将其内容复制到字节数组或 ByteArrayInputStream 中。
6. 总结
InputStream 类是 Java I/O 系统的核心组件之一,提供了读取字节数据的基本功能。理解 InputStream 及其子类对于处理各种输入源(如文件、网络连接、内存缓冲区等)至关重要。在实际应用中,应该注意资源管理、异常处理和性能优化等问题。
点我分享笔记