如果只包含一行,则无法读取标准输入

时间:2017-07-15 18:50:17

标签: java io

我正在使用InputStreamReader一次性读取stdin的所有输入。问题是,如果输入只包含一行,则不会读取任何内容。它只返回-1,好像已经到达流的末尾。

我正在使用Intellij并通过按CMD + D来发送文件结束信号。此过程工作正常,除非它只有一行。

这是代码。

char[] buff = new char[1048576];
int numRead = 0;
Reader reader = new InputStreamReader(System.in);
StringBuilder sb = new StringBuilder();

while (true) { 
    numRead = reader.read(buff);

    if (numRead == -1) break;
    else sb.append(buff, 0, numRead);
}  

1 个答案:

答案 0 :(得分:0)

我无法使用您在常规终端中发布的代码重现此问题(我不知道IntelliJ会做什么或不会做什么。这里是完整的,可运行的例如:

$ cat Test.java
import java.io.*;

class Test {
    public static void main(String[] args) throws Exception {
        char[] buff = new char[1048576];
        int numRead = 0;
        Reader reader = new InputStreamReader(System.in);
        StringBuilder sb = new StringBuilder();

        while (true) {
            numRead = reader.read(buff);

            if (numRead == -1) break;
            else sb.append(buff, 0, numRead);
        }

        System.out.println("The buffer contains " + sb.length() + " characters.");
    }
}

$ javac Test.java

如果我用enter写一行并按Ctrl-D一次:

$ java Test
hello
The buffer contains 6 characters.
$

如果我在没有输入的情况下写一行,请按Ctrl-D一次

$ java Test
hello

什么都没发生。这是预料之中的。现在我再次按下Ctrl-D:

$ java Test
helloThe buffer contains 5 characters.
$

写出预期的字符数。

这就是发生的事情:

  1. 您输入hello。这些字节存储在终端的编辑缓冲区中,并且不能立即供程序使用。
  2. 按Ctrl-D。这会导致当前编辑缓冲区被写入程序,并且编辑缓冲区被截断。
  3. 程序读取5个字节,追加它们并循环。
  4. 再次按Ctrl-D。这再次导致当前编辑缓冲区被写入程序。
  5. 由于编辑缓冲区中当前没有任何内容,因此会导致读取0字节,即EOF的Unix。根据Java API,Java会看到它并将其转换为-1。
  6. 如果程序按照你描述的方式运行,没有读取前5个字节,并且立即返回-1,这就是你所看到的:

    $ java Test
    helloThe buffer contains 0 characters.
    

    我不知道IntelliJ会做什么或不会做什么,但它应该在终端中正常工作。

    请再试一次并仔细检查您发布的代码,而不是整个程序。也许其余部分需要尾随\n才能正常工作。