java - 在java中,如何结束 inputstream.read

  显示原文与译文双语对照的内容
0 0

我正在尝试从串行连接的5个设备读取数据。 如果设备正常运行,我的Java代码运行正常,如果不是 inputstream.read() 挂起程序并且不允许进一步执行。

我试过用 inputstream.available()BufferedInputStream 。 但一切都不起作用。

我想做的是: 如果一个设备没有响应我的代码,它应该结束它自己,让控制进入到它将进入下一个设备的主程序。 套接字在轮询的一个周期内仍然处于打开状态。


Socket es = new Socket("10.12.90.153",4001); 
OutputStream osnew= es.getOutputStream(); 
InputStream isnew = new BufferedInputStream(es.getInputStream()); 

这是在任务程序中完成的,然后我将 osnewisnew 传递到每一个设备的一个间隙,。 osnew 写入设备响应的某些数据。 然后我从 isnew 那里读到。program程序挂起的地方。

时间: 原作者:

0 0

当你尝试读取数据并且没有可用的数据时,InputStream 被设计为阻止。 可以调用 available() 方法是否有数据可用阅读没有阻碍,但这只适用一个方法——如果 available() 返回非零你知道你可以阅读没有阻止,但如果它返回0你不会一定被阻塞。 是完全有效的一个输入流从 available() 总是返回0.

你可能希望查看 java.nio的非阻塞 I/O api,而不是使用流。

原作者:
0 0

你可以在单独的线程中处理每个设备。 这样你的程序就能保持响应即使设备不在。 但是要注意多线程编程的缺陷。

关于多线程编程的更多信息可以在 http://docs.oracle.com/javase/tutorial/essential/concurrency/ 找到。

原作者:
0 0

你从设备上读到了什么? 我假设你用某种形式的FileInputStream来做它。 这个类看起来适合于从 文件系统 到我的阅读,但是一个设备,它可能会阻塞一个很长时间的Java线程,直到设备响应一个线程。 你需要对设备进行某种计时的读取请求,并且我知道 NOT的任何Java类。

最好的建议是,我要编写一些JNI代码,这些代码很好地交流,并不会阻止你的设备停止响应。 这就是我跟USB设备通话时所做的。 如果我正在编码这个( 用于 Linux ),我将使用 select ( 它有一个时间周期参数) 来等待来自任何设备的输入。

原作者:
...