当前位置: 首页 > 知识库问答 >
问题:

如何利用InputStream使(Java)程序在管道输入结束时自动结束

夏学名
2023-03-14

这个问题可以更好地表述为:如何在不阻塞的情况下检测InputStream中的EOF

我有一个java程序,它可以直接从System.in中获取输入(不使用扫描器),我也可以像任何程序一样直接将输入管道输入到java程序中。但是,当我将输入管道输入到程序中时,程序继续运行。这个想法是,如果输入被管道输入,就停止程序,但如果我们在等待用户输入,就保持程序运行。

final InputStream in = System.in; // sometimes in won't be System.in
final byte[] buffer = new byte[1024];
while(true){
    int len;
    // the reason I use in.available() is so I only read if in.read() won't block
    while(in.available() > 0 && (len = in.read(buffer)) > -1){
        String s = new String(buffer, 0, len);
        // do something with string
    }
    // sometimes do other stuff not relevant to this question
}

编辑:无论出于什么原因,我花了大约2个小时的时间在互联网上寻找一个简单的解决方案。我尝试使用InputStream,甚至将代码转换为ReadableByteChannel(使用channels.newChannel()创建),看看是否可行。我能找到的包装InputStream的每一个实现都在阻塞。我想解决这个问题的唯一方法是使用另一个线程。祝未来观众好运。

共有1个答案

曹建明
2023-03-14

您并不真正需要.available()中的。当管道耗尽时,变量len将为-1,内部while循环将结束。您可以根据需要中断外部while循环

 类似资料:
  • 问题内容: 看一下这段代码: 通常,到达的结尾时,程序会终止。但是在此示例中,程序将打印“ main of End”,然后继续运行,因为线程仍在运行。有没有一种方法可以使线程在结束时 自动 停止,而无需使用类似的东西? 问题答案: 您正在创建的线程是独立的,并且不依赖于主线程终止。您可以使用线程。 当没有其他线程在运行时,守护进程线程将由JVM终止,它也包括一个执行主线程。

  • 本文向大家介绍Java如何利用return结束方法调用,包括了Java如何利用return结束方法调用的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java如何利用return结束方法调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下: 效果如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教

  • 我正在我的程序中创建一些线程。这里我使用了join方法,这样主线程就会等待我的所有线程。但是每当我运行这个程序的时候,它并没有完成,所有的信息消息都被打印出来,但是程序仍然没有顺利结束。有没有人能帮我解决这个问题呢? 下面是我的代码: 下面是DeployerThread的代码: 下面是线程转储: “CompilerThread0”后台进程Prio=3 TID=0x002E4310 NID=0x20

  • 问题内容: 如果我在无限循环中有一个线程,有没有办法在主程序结束时(例如,当我按 +时 )终止它? 问题答案: 检查这个问题。正确答案对如何以正确的方式终止线程有很好的解释: 是否有任何方法可以杀死Python中的线程? 要使线程在键盘中断信号(ctrl + c)上停止,您可以在退出之前捕获异常“ KeyboardInterrupt”并进行清除。像这样: 这样,您可以控制程序突然终止时的处理方式。

  • 我使用fetch简单地从虚拟apiendpoint获取数据,但当我在函数中添加配置时,我得到了一个意外的输入错误结束。 这工作得很好,控制台记录了200个项目的数组 但当我将configs作为参数添加时,它会显示和错误。 错误: 和

  • 所以我想让用户输入“true”或“false”来退出循环。现在,无论我输入什么,它都会退出循环。 顺便说一句,这是一个关于色彩卫士的节目