<分区>
如果程序通过管道将数据发送到我的 Java 标准输入流,我如何让我的 Java 程序自动检测是否有新数据通过管道进入输入流以便我可以读取它?
我知道我可以使用一个无限的 while 循环来不断读取和检查标准输入流。但这是低效的,并且需要大量资源。我什至不被允许为我的任务做这件事。
它必须以某种方式同步。我可以在管道或标准输入上放置一个监听器,说:“嘿!现在读取标准输入!新数据即将到来!”或者我可以让管道发送中断或者我该怎么做?
标签 java
<分区>
如果程序通过管道将数据发送到我的 Java 标准输入流,我如何让我的 Java 程序自动检测是否有新数据通过管道进入输入流以便我可以读取它?
我知道我可以使用一个无限的 while 循环来不断读取和检查标准输入流。但这是低效的,并且需要大量资源。我什至不被允许为我的任务做这件事。
它必须以某种方式同步。我可以在管道或标准输入上放置一个监听器,说:“嘿!现在读取标准输入!新数据即将到来!”或者我可以让管道发送中断或者我该怎么做?
最佳答案
正如其他人所说,没有办法检查是否可以从不阻塞当前线程的 InputStream
(或 Reader
)获取输入...或涉及昂贵的轮询。
简单的解决方案就是尝试读取,然后阻塞直到数据到达。这个解决方案是可以的除非 ...
在这种情况下,您要么需要使用 NIO 选择器(它允许您等待数据到达一组流中的一个,要么使用不同的线程从每个流中读取数据,并使用其他线程处理数据(或做其他事情)。在后一种情况下,您可能需要某种排队机制来将“消息”从一个/多个读取线程传递到一个/多个处理线程。
但是,最重要的是,如果没有您的应用程序的更多详细信息,我们无法提供良好的具体解决方案。
一条建议:不要尝试使用 InputStream.available()
或 Reader.ready()
。这些涉及轮询......并且它们指定的语义无法明确告诉您 read
将 阻塞。他们基本上没用......
关于java - 从 Java 标准输入读取,无需轮询或不断读取,也不会浪费资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21322375/