如何在java中结束inputstream.read

时间:2013-06-19 12:15:28

标签: java

我正在尝试从连续连接的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读取...程序挂起。

3 个答案:

答案 0 :(得分:0)

InputStream旨在阻止您尝试读取数据时没有可用的数据。你可以调用available()方法来查看是否有任何数据可以无阻塞地读取,但这只能以一种方式工作 - 如果available()返回非零,你知道你可以不受阻塞地读取,但是如果它返回零,您将不会必然被阻止。对于始终available()返回零的输入流完全有效。

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

答案 1 :(得分:0)

您可以在单独的线程中处理每个设备。这样,即使设备没有,您的程序也会保持响应。但请注意多线程编程的缺陷。

有关Java中多线程编程的更多信息,请参见http://docs.oracle.com/javase/tutorial/essential/concurrency/

答案 2 :(得分:0)

你是如何阅读设备的?我假设您正在使用某种形式的FileInputStream来执行此操作。该类看起来适合从文件系统读取给我,但是可能会长时间阻塞的设备可能会锁定Java线程,直到设备响应为止。您需要对设备进行某种定时读取请求,并且我不知道是否有任何Java类这样做。

我最好的建议是编写一些JNI代码,它可以很好地协商,并且在您的设备停止响应时不会阻止。这就是我在与USB设备通话时所做的事情。如果我正在对此进行编码(对于Linux),我会使用select(具有时间段参数)来等待来自任何设备的输入。