一个相关的问题就是这个问题:Where is the specification that defines this behavior for InputStreamReader?,但我不确定它是否会回答我... 请注意,我只是尝试使用该语言。 我有这段代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Capitalize {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(
System.in))) {
char c;
do {
c = Character.toUpperCase((char) br.read());
System.out.print(c);
} while (c != (char) -1);
} catch (IOException e) {
e.printStackTrace(System.err);
}
}
}
使用ubuntu linux,我希望输出如下:
fFoOoO bBaArR
但相反,它是这样的:
foo bar (line feed)
FOO BAR (waits for more characters or Ctrl + D)
现在我不确定Windows中的行为是什么,可能它有所不同,但是,这仍然让我感到困惑。阅读read
方法的文档,我看到它只会在到达流末尾时返回-1。我有点理解这对于读取文件有什么用处,但在这种情况下,控制台怎么样?为什么要等到键入Ctrl + D?有没有办法在不必键入Ctrl + D的情况下到达流的末尾?有没有办法实现我的期望?
提前致谢
答案 0 :(得分:2)
正如EJP评论,这与InputStream / BufferedReader无关。您所看到的是Linux“tty”输入驱动程序的行为和典型的控制台命令。
您所看到的是正常的“线路编辑”或“线路缓冲”。当您按下<Enter>
键时,输入仅供Java读取(通过stdin文件描述符)。您之前看到的输出是从“tty”驱动程序回显的字符。 (请注意,如果输入<Backspace>
或其他......字符将被删除。当您键入<Enter>
时,Java不会看到退格等。它们已被删除。)
通过java.io.Console
类输入的行为方式相同。
在Windows上也是如此:行为是可移植的。 (这是一件好事...)
如果您希望Java应用程序在键入字符时查看字符,则在键入字符时,您需要使用第三方库(或本机代码)来实现此功能。 (在Linux中,它需要将tty驱动程序切换到“原始”模式......并且此功能是不可移植的,标准Java SE不支持。)