InputStream

张开发
2026/4/11 11:40:50 15 分钟阅读

分享文章

InputStream
InputStream一、基础概念在 Java 的 I/O 流体系中InputStream 类位于 java.io 包下是所有字节输入流的超类。二、read() 方法调用任何read()方法后读到的数据会从stream中流出不再保存在stream中。InputStream.read() 方法主要有以下几种形式int read()描述从输入流中读取下一个字节的数据。如果到达流的末尾则返回 -1。返回值返回读取的字节0 到 255 之间的整数如果已到达流的末尾则返回 -1。抛出异常可能会抛出 IOException 异常表示发生 I/O 错误。int read(byte[] b)描述从输入流中读取最多 b.length 个字节的数据并将其存储在提供的字节数组 b 中。实际读取的字节数将作为返回值返回如果因为已经到达流的末尾而不能再读取更多字节则返回 -1。参数byte[] b - 存储读取数据的缓冲区。返回值返回读取的字节数0 到 b.length 之间如果已经到达流的末尾则返回 -1。抛出异常可能会抛出 NullPointerException如果 b 为 null、IndexOutOfBoundsException如果 b.offset 或 b.count 无效以及 IOException 异常。int read(byte[] b, int off, int len)描述尝试从输入流中读取最多 len 个字节的数据并将这些数据存储到指定的字节数组 b 中在b中从偏移量 off 开始存储off是targetOffset而不是sourceOffset。实际读取的字节数将作为返回值返回如果因为已经到达流的末尾而不能再读取更多字节则返回 -1。参数byte[] b - 存储读取数据的目的缓冲区。intoff - 从目的缓冲区的哪个位置开始存储数据是指参数b中的偏移量而不是在stream中的偏移量。int len - 最多读取多少个字节。返回值返回读取的字节数0 到 len 之间如果已经到达流的末尾则返回 -1。抛出异常可能会抛出 NullPointerException如果 b 为 null、IndexOutOfBoundsException如果 off、len 或 b.length - off 无效以及 IOException 异常。三、注意事项对于网络流或某些类型的文件流可能需要多次调用 read() 方法才能读取完整的数据内容因为单次调用可能无法读取所有数据。使用完 InputStream 后应调用其 close() 方法来释放与该流关联的系统资源。这通常在一个 try-with-resources 语句块中自动完成或者在使用完流后显式调用 close() 方法。Java 中InputStream.read()方法是阻塞的。‌InputStream.read()在以下情况下会阻塞当前线程‌没有数据可读‌当输入流中尚无可用字节时方法会一直等待直到有数据到达、检测到流结束EOF或发生异常。‌网络或套接字场景‌例如通过Socket.getInputStream()读取数据时若对方未发送数据或未关闭连接read()将无限期阻塞。‌标准输入等交互式流‌如System.in.read()会等待用户输入。关键说明‌阻塞行为是默认且设计使然‌属于 Java 的传统阻塞 I/OBIO模型的一部分。‌返回值-1表示流已结束‌并非阻塞状态只有在流未结束但无数据时才会阻塞 。‌不同实现略有差异‌‌文件流‌如FileInputStream通常不会长期阻塞除非文件被其他进程锁定。‌网络流‌如Socket.getInputStream极易因网络延迟或对方未发送数据而阻塞。常见解决方案为避免程序因阻塞而挂起可采用以下方式‌设置超时时间‌适用于Socketsocket.setSoTimeout(5000); // 5秒超时‌使用多线程‌将读取操作放在独立线程中避免阻塞主线程 。‌使用非阻塞 I/ONIO‌通过Selector和SelectableChannel实现多路复用。示例ServerSocketChannel配置为非阻塞模式并注册到Selector。‌检查可用数据‌谨慎使用if (inputStream.available() 0) { int data inputStream.read(); }注意available()仅提供提示不能完全替代阻塞控制。FileInputStream在Java中FileInputStream、InputStreamReader和BufferedReader是用于读取文件的常见类。它们通常一起使用来高效地读取文本文件。下面是如何使用这些类的步骤1.FileInputStreamFileInputStream用于从文件中读取原始字节数据。2.InputStreamReaderInputStreamReader是一个桥梁它将字节流转换为字符流。它需要一个字符集名称例如UTF-8这样它才能正确地将字节转换为字符。3.BufferedReaderBufferedReader提供了缓冲功能这可以显著提高读取文本文件的速度。它包装了另一个读取器如InputStreamReader并提供了额外的功能如逐行读取。

更多文章