【问题标题】:Scanner + System.in stop condition [duplicate]扫描仪+ System.in停止条件[重复]
【发布时间】:2010-11-30 15:33:08
【问题描述】:

我正在使用 Scanner + System.in 读取文件。我在 Linux 中的命令如下所示:

cat -A test.txt | java -jar test.jar

我正在阅读如下输入:

Scanner input = new Scanner(System.in);

    while (input.hasNextLine())
    {
        String log_line = input.nextLine();
    }

问题是.. 到达文件末尾时如何停止阅读?

【问题讨论】:

  • 不确定如何将其标记为与发布此问题四年后提出的问题的重复。
  • @MeghanArmes 投票结束时,时间并不重要。我们更喜欢更好的帖子作为目标。
  • @Jarrod 关闭问题作为已关闭问题的副本通常不是一个好主意。它阻止了任何获得新答案的方法。请重新打开。
  • @PatrickHofman 时间无关紧要,但问题状态确实如此,在 IMO 的 Stack Overflow 上。编程中的事情发生了变化,有时需要新的答案。所以我们不应该关闭任何与已关闭问题重复的内容。
  • 确实如此,但这也不是一个新问题,过去 7 年没有受到任何关注。 @沙

标签: java file-io java.util.scanner system.in


【解决方案1】:

问题在于 System.in 永远不会“结束”,即 EOF 永远不会发送到流中,因此最后一行之后的 hasNextLine() 会阻塞等待更多数据。

解决方案是将文件名传递给您的应用程序,然后打开 FileInputStream(filePath) 并在 Scanner 构造函数中使用它。

【讨论】:

  • 奇怪,但它对我有用(只需复制/粘贴 Serhiy 的代码并将行回显到标准输出):)
  • Myabe 扫描仪有什么替代品吗?我不想通过 args 传递文件名..
  • 我不是在争论你的解决方案(它更好/更安全),只是好奇:img13.imageshack.us/img13/3706/scanner.png
【解决方案2】:

看来问题是 -A 选项,而不是您的 java 代码(它在纯文件上正常工作):

$ echo -e "foo\nbar" | java -jar Test.jar 
foo
bar
$

也许 test.txt 包含一些 Scanner 无法处理的不可打印字符...

【讨论】:

  • test.txt 是由另一个程序生成的文件,所有字符看起来都很好.. echo 是什么意思? Echo 不显示文件的内容?以前我使用tail命令并且有条件停止的问题..我想是的..
  • 我使用 echo 只是为了方便;它没有太大区别(是的,echo -e "1\n2\n3" > test.txt | tail -n 2 test.txt | java -jar dist/Test.jar 2 3 之类的东西也可以。顺便问一下,你用什么终端模拟器?
  • 天啊,我一定是真的很蠢或者真的很累。。我的另一个线程没有停止,所以程序不会退出。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多