我有一个来自黑盒的输入流(例如B)。来自此流的所有消息都是序列化的二进制数据,每个消息均以4字节int开头。其中大多数是记录数据,每天运行24小时。我使用readInt()方法读取了这四个字节。现在,偶尔地,主线程将退出并带有EOFException并使程序崩溃。

经过研究,我发现当readInt()时输入流中的字节数少于四个时,就会发生这种情况。我的猜测是,两次连续读取之间缓冲区的填充速度不够快。我正在考虑的一些可能的解决方案包括:在读取之前检查available()(考虑到数据的amt会占用过多的周期),或者在发生异常时重新启动(听起来像编程不良)。我认为,如果我只能使用readInt()进行阻止,那将是最好的方法。我已经看过readInt()的实现,但是它又可以归结为使用read()进行阻塞。

有人知道更好的解决方案吗?

最佳答案

在调用层次结构中进行的任何阻塞调用都将被“绑定”,以使所有调用都被阻塞,因为这两个调用都是同一执行线程的一部分。 readIntDataInputStream方法对基础输入流的read方法进行了四个调用,只要没有可用的数据,这些调用肯定会阻塞,因此您似乎对“缓冲区不能足够快地填充”的担心符合逻辑

在服务器进程中断或断开连接的情况下,我遇到了此类异常,在这种情况下,客户端最终读取-1并引发异常。您是否在客户端/服务器代码中吞噬了任何形式的异常?您的日志是否显示任何可疑的内容?

09-27 13:42