【发布时间】:2011-06-20 17:11:38
【问题描述】:
我有一个来自黑盒(比如 B)的输入流。来自该流的所有消息都是序列化的二进制数据,每条消息都以一个四字节 int 开头。其中大部分是记录数据,每天 24 小时运行。我使用 readInt() 方法读取了这四个字节。现在,偶尔,主线程会以 EOFException 退出并使程序崩溃。
经过研究,我发现它发生在readInt()时输入流中少于四个字节的情况下。我的猜测是缓冲区在连续读取之间的填充速度不够快。我正在考虑的一些可能的解决方案包括在读取之前检查 available() (考虑到数据量会消耗太多周期)或在发生异常时重新启动(听起来像是糟糕的编程)。如果我能阻止使用 readInt(),我认为这将是最好的方法。我已经查看了 readInt() 的实现,但它再次归结为使用 read() 阻塞。
有人知道更好的解决方案吗?
【问题讨论】:
-
您似乎通过生成文字墙来阻止阅读流程;-) 引入一些段落可能会使这更具可读性(并有助于获得答案)。
-
您从哪种流中读取?
-
你说得有道理,约阿希姆。我会更加小心。我正在使用 Stas 猜测的 DataInputStream。在另一端有一个嵌入式设备使得在那里改变东西变得困难。我的猜测是,黑盒可能会间歇性地发送字节块,而不关心消息是否完整发送。流有时可能会干涸而没有完整的内容。
标签: java exception-handling tcp network-programming stream