我正在使用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);
}
答案 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.
$
写出预期的字符数。
这就是发生的事情:
hello
。这些字节存储在终端的编辑缓冲区中,并且不能立即供程序使用。如果程序按照你描述的方式运行,没有读取前5个字节,并且立即返回-1,这就是你所看到的:
$ java Test
helloThe buffer contains 0 characters.
我不知道IntelliJ会做什么或不会做什么,但它应该在终端中正常工作。
请再试一次并仔细检查您发布的代码,而不是整个程序。也许其余部分需要尾随\n
才能正常工作。