InputStream如何判断数据已经读取结束

本文解释了在数据传输过程中如何判断数据是否已全部接收,包括文件读取结束的概念及Socket通信中三种常用方法:约定数据长度、设置超时时间和发送端关闭连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么叫读取结束?那个is.read()得到的-1是怎么来的呢?

举个例子,我给你发数据,
1 我发你一个
2 你接收一个
3 我等。。。。。。
4 你呢? 你怎么知道我是继续发,还是已经发完了呢?因为你无法确定所以
4.1 如果你设定了超时等待时间 ,那么超过这个时间,你就会认为没有数据了
4.2 如果没有,我看你只好继续等,等。等。。。。。。。。。。。。。。

我想我说的很明白了吧。

对于文件,操作系统在你读取到最后一个字节后,会自动不允许你读取的,判断文件是否结束很简单。但Socket不行

解决的方法有3个
1 约定发送的数据长度,比如 http的 keepAlive 就是必须依赖这个的 Content-Length
2 设置超时的时间,根据我的经验,只有在Socket级别设置才有效.
Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // 如果超过100毫秒还没有数据,则抛出 SocketTimeoutException


3 让发送端发送完数据后,关闭连接。 这个在Http的操作时很常见。


### Java IO 读取文件结束条件判断方法 在Java中,当使用不同类型的流来读取文件时,可以通过特定的返回值来判断是否已到达文件末尾。对于字节流`InputStream`以及字符流`Reader`及其子类来说,在尝试从流中读取数据而实际上没有更多可读的数据时,这些方法会返回特殊的标识值。 #### 使用 `BufferedReader` 的 `readLine()` 方法 当利用`BufferedReader`对象调用`readLine()`函数并达到文件结尾处时,该函数将返回`null`作为指示符[^1]: ```java try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } ``` #### 使用 `FileReader` 或其他基于字符的输入流 对于直接继承自`Reader`抽象基类的对象(比如`FileReader`),可以逐个字符地读取直到遇到表示EOF(End Of File)即文件结束的状态码-1为止[^2]: ```java public class FileReaderExample { public static void main(String[] args) { try (FileReader fr = new FileReader("example.txt")) { int content; while ((content = fr.read()) != -1) { System.out.print((char) content); } } catch (IOException e) { e.printStackTrace(); } } } ``` #### 文件存在性和合法性验证 除了上述针对具体读取过程中的终止检测外,在实际应用之前还应该先确认目标文件确实存在于指定路径下并且是可以访问的正常文件[^4]: ```java if (file.isFile() && file.exists()) { // 执行读取逻辑... } ``` 通过以上几种方式可以在不同的场景下有效地处理文件读取过程中可能出现的各种情况,并确保程序能够正确识别何时完成了整个文件的内容读入工作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值