Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种方法可以在特定的时间内读取inputstream?_Java_Stream_Timeout_Inputstream - Fatal编程技术网

Java 有没有一种方法可以在特定的时间内读取inputstream?

Java 有没有一种方法可以在特定的时间内读取inputstream?,java,stream,timeout,inputstream,Java,Stream,Timeout,Inputstream,我遇到过这样一种情况:一个线程打开一个到目标m/c的telnet连接,并从一个程序中读取数据,该程序会吐出其缓冲区中的所有数据。清除所有数据后,目标程序打印一个标记。我的线程一直在寻找此标记以关闭连接(成功读取) 有时,目标程序不打印任何标记,它不断转储数据,我的线程不断读取数据(目标程序不打印标记) 所以我只想读取特定时间段的数据(比如15分钟/分钟)。在java API级别有什么方法可以做到这一点吗?使用另一个线程在15分钟后关闭连接。或者,您可以在每次读取后检查15分钟是否已过去,然后简单

我遇到过这样一种情况:一个线程打开一个到目标m/c的telnet连接,并从一个程序中读取数据,该程序会吐出其缓冲区中的所有数据。清除所有数据后,目标程序打印一个标记。我的线程一直在寻找此标记以关闭连接(成功读取)

有时,目标程序不打印任何标记,它不断转储数据,我的线程不断读取数据(目标程序不打印标记)


所以我只想读取特定时间段的数据(比如15分钟/分钟)。在java API级别有什么方法可以做到这一点吗?

使用另一个线程在15分钟后关闭连接。或者,您可以在每次读取后检查15分钟是否已过去,然后简单地停止读取并清理连接,但这只有在您确定远程服务器将继续发送数据(如果没有,则读取将无限期阻塞)时才起作用。

通常情况下,不会。输入流不提供超时功能

但是,在您的特定情况下,即从套接字读取数据,是的。您需要做的是设置一个非零值(以毫秒为单位的超时)。任何阻塞指定时间的读取操作都将抛出一个错误


但请注意,即使在此之后套接字连接仍然有效,继续从中读取可能会带来意外的结果,因为您已经消耗了一半的数据。处理此问题的最简单方法是关闭连接,但如果您跟踪已读的内容,则可以选择恢复并继续阅读。

如果您使用Java套接字进行通信,则应查看此方法


套接字上的read()操作将仅在指定的时间内阻塞。之后,如果没有收到任何信息,将引发
java.net.SocketTimeoutException
,如果处理正确,执行将继续。

如果服务器真的永久转储数据,则客户端在读取操作中永远不会被阻止。因此,您可以定期检查(读取之间)当前时间减去开始时间是否超过了可配置的延迟,如果超过了,则停止读取


如果客户端可以在同步读取中被阻止,等待服务器输出某些内容,那么您可以使用,并启动一个计时器线程来中断主读取线程,或关闭其输入,或关闭通道。

我希望我没有弄错您的问题,但当您使用调用read()的InputStream读取数据时使用1024字节的缓冲区,您可以通过计算每个循环的开始时间来计算读取时间。是的,这种方法可以工作,但这不是最佳的吗?java有一个内置的套接字超时机制,无需为此创建线程。setSoTimeout设置每次调用
read
时的超时。如果远程端不断输出数据,这将无济于事。请参阅,只有当线程在读取操作中被阻塞时,超时才会起作用。如果线程无休止地读取来自服务器的数据,它将无法工作(OP的情况似乎就是这样)