java - 从 Java 标准输入读取,无需轮询或不断读取,也不会浪费资源

标签 java

<分区>

如果程序通过管道将数据发送到我的 Java 标准输入流,我如何让我的 Java 程序自动检测是否有新数据通过管道进入输入流以便我可以读取它?

我知道我可以使用一个无限的 while 循环来不断读取和检查标准输入流。但这是低效的,并且需要大量资源。我什至不被允许为我的任务做这件事。

它必须以某种方式同步。我可以在管道或标准输入上放置一个监听器,说:“嘿!现在读取标准输入!新数据即将到来!”或者我可以让管道发送中断或者我该怎么做?

最佳答案

正如其他人所说,没有办法检查是否可以从不阻塞当前线程的 InputStream(或 Reader)获取输入...或涉及昂贵的轮询。

简单的解决方案就是尝试读取,然后阻塞直到数据到达。这个解决方案是可以的除非 ...

  • 你想在等待数据到达的同时做其他事情,或者
  • 数据可能到达许多输入流之一。

在这种情况下,您要么需要使用 NIO 选择器(它允许您等待数据到达一组流中的一个,要么使用不同的线程从每个流中读取数据,并使用其他线程处理数据(或做其他事情)。在后一种情况下,您可能需要某种排队机制来将“消息”从一个/多个读取线程传递到一个/多个处理线程。

但是,最重要的是,如果没有您的应用程序的更多详细信息,我们无法提供良好的具体解决方案。


一条建议:不要尝试使用 InputStream.available()Reader.ready()。这些涉及轮询......并且它们指定的语义无法明确告诉您 read 阻塞。他们基本上没用......

关于java - 从 Java 标准输入读取,无需轮询或不断读取,也不会浪费资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21322375/

相关文章:

java - 在android studio中更改构建sdk时出错

java - tomcat 8 访问位于 webapps 使用 tomcat url 的图像

java - 来自 Java 的 Redis 基准测试

java - 处理不同的 JSONArray 类型

java - Paint 方法被多次调用...如何限制?

java - 不知道如何避免这个 ClassCastException

java - 如何根据Key从PairRDD中获取新的RDD

java - (对我来说)字符数组中无法解释的值

java - 将java中的浮点变量格式化为最多2位数字

java - 如何在 spring security 4 xml 配置中禁用特定 url 的安全性以检索访问 token