关于InputStream类的available()方法
发布日期:2021-05-17 04:58:20 浏览次数:11 分类:精选文章

本文共 1344 字,大约阅读时间需要 4 分钟。

读取InputStream dostupnych字节的注意事项

在实际编程中,经常需要一次性读取多个字节。在这种情况下,InputStream类中的available()方法是一个非常有用的工具。该方法可以在读取/写入操作之前告知数据流中可读/可写的字节数。需要注意的是,特别是在网络操作中,这个方法可能会导致一些令人困惑的问题。

网络操作中的问题

当使用Socket进行网络通信时,如果对方发送了1000个字节,可能会分成几批发送到达。这时候,如果调用available()方法,只能得到零、100或900这样的数值。这种情况可能令人困惑,因为事实上数据确实被发送了,但发送可能尚未完成。

为什么会出现这种情况?

在网络通信中,数据传输是间断性的。对方可能将数据分成多个包发送,这意味着每个包的传输时间不同。在调用available()方法时,只能获取到当前可用的字节数,而不一定是在一个周期性或者定时的间隔传输的情况下。

举例来说,如果对方将1000个字节分成3批发送给你,那么你只需要调用available()3次,就能确保你获取到了全部的字节数信息。这意味着,你不能单独调用一次available()方法来获得全部的数据长度信息。

改写后的代码示例

以下是一个正确的读取逻辑示例:

int count = 0;while (count == 0) {    count = in.available();}byte[] buffer = new byte[count];in.read(buffer);

这样做的关键在于循环调用available()直到返回的字节数不为零。一旦数据准备就绪,循环将终止,读取操作可以安全地进行。

原因相互作用

在本地文件读取中,available()方法通常能够准确反映文件的当前位置。然而,在网络操作中,数据传输可能遇到包丢失、慢速或者不均衡的情况,这就是我们为什么需要循环调用available()直到数据准备好的原因。

实用提示

在编写网络客户端程序时,建议不要假定data一定是按完整包发送的。如果不是确定对方会按照固定大小发送数据,那么总是循环调用available()是一个更安全的做法。

需要注意的是,有时候系统资源不足或网络延迟也可能导致available()返回零。因此,在循环调用时,最好同时增加一个超时机制,以防止无限循环。

后续改进

如果你需要处理更复杂的网络通信问题,建议学习关于TCP协议和socket编程的更多知识。例如,TCP认为数据是流式的,而UDP是无连接的。因此,对于不同的数据传输需求,你可能需要更高级的网络通信机制。

如果你发现发现available()方法经常返回零,可能有必要重新审视你的网络连接配置和数据传输协议选择。如果对方使用的协议不支持可连接性或者数据传输确认机制,这可能会导致问题。

总结

在使用inputstream的available()方法时,特别是在网络操作中,循环调用该方法直到返回的字节数不为零是一个关键技巧。这可以帮助你确保读取到完整的数据流。这也是避免常见数据传输问题的一种有效方法。通过多次调用available()方法,你可以更可靠地了解数据量,从而进行相应的读取操作。

上一篇:Apache Log4j配置说明
下一篇:Quartz

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月23日 11时05分13秒