java - 没有输入时扫描仪卡住程序

标签 java pipe

我正在制作一个主要用于管道的应用程序。在程序开始时,以下是我获取所有输入的方式:

Scanner scanner = new Scanner(System.in);
List<String> input = new ArrayList<>();

while (scanner.hasNextLine()) {
    input.add(scanner.nextLine());
}

scanner.close();
与管道一起使用时,效果很好。例如,运行 ls | java -jar ...它打印出从 ls 给出的所有行.但是,当我刚运行时 java -jar ...没有输入/管道,它会卡住并且没有任何 react 。即使我按下回车键并捣碎我的键盘,它仍然卡住了。我只能使用 ctrl-c 停止程序。我认为这是因为没有什么可阅读的,所以 Scanner 会一直等到有可阅读的东西。我如何阅读 System.in 中的所有行没有卡住,还是有更好的方法来做到这一点?谢谢。
编辑:
明确将此标记为重复的人没有阅读我的问题。我的问题是检查 System.in是空的不卡住程序,而不是如何通过输入阶段。很冷,因为System.in 中什么都没有所以扫描仪需要永远,但我想检查 System.in 中是否没有任何内容.
回答:
谢谢@QiuZhou 的回答。我修改了他的第二个例子来得到这个:
List<String> input = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

while (reader.ready()) {
    String nextLine = reader.readLine();
    input.add(nextLine);
}
它就像一个魅力。

最佳答案

它卡住是因为,正如您所说,没有什么可阅读的,所以扫描仪会等到有什么可阅读的内容,但是您想在不卡住的情况下读取 System.in 中的所有行,这对我来说听起来有点矛盾,这不像从一个文件,我们不知道使用您的程序的人要输入多少行,除非该人告诉我们。我建议你定义一个特殊字符为 end of input ,例如,done , 当此人决定他已完成时,只需输入 done结束等待:

        Scanner scanner = new Scanner(System.in);
        List<String> input = new ArrayList<>();

        System.out.println("Please enter something. Enter 'done' when finished.");

        while (scanner.hasNextLine()) {
            String nextLine = scanner.nextLine();
            if(nextLine.equals("done"))break;
            input.add(nextLine);
        }

        scanner.close();
查看 System.in 中是否有可阅读的内容不会被困在那里,您可以使用 BufferedReader.ready() 来做到这一点。 ,当文档读取时,注意 in.ready() 将返回 true 当且仅当对流的下一次读取不会阻塞。
        System.out.println("Please enter something. Enter 'done' when finished.");

        List<String> input = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while(true) {
            if (reader.ready()) {
                String nextLine = reader.readLine();
                if(nextLine.equals("done"))break;
                input.add(nextLine);
            }
            //since ready() will not block, you can add additional logic here, like if it
            //takes too long to read next line from input, you can just end here
            // break;
        }

关于java - 没有输入时扫描仪卡住程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64365322/

相关文章:

java - 将子类型集合分配给父类型

java - ProgressMonitor 和 SwingWorker 不工作

java - 以 Wicket 形式显示搜索结果数量

c++ - 串联加入 3 个 C++ 程序

python - 如何使用 Python 将标准输入/标准输出通过管道传输到 Perl 脚本

c - 超过 2 个子节点之间的管道失败 - C

java - Sigar 不满意链接错误

java - hadoop 中未创建 SequenceFile

bash - 如何删除管道中的每个第二个字节?

C++ – cURL cmd, stderr 管道传输到程序,非常慢