java InputStreamReader / BufferedReader“读取”行为

时间:2014-08-20 00:58:25

标签: java bufferedreader inputstreamreader

一个相关的问题就是这个问题: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的情况下到达流的末尾?有没有办法实现我的期望?

提前致谢

1 个答案:

答案 0 :(得分:2)

  1. 正如EJP评论,这与InputStream / BufferedReader无关。您所看到的是Linux“tty”输入驱动程序的行为和典型的控制台命令。

  2. 您所看到的是正常的“线路编辑”或“线路缓冲”。当您按下<Enter>键时,输入仅供Java读取(通过stdin文件描述符)。您之前看到的输出是从“tty”驱动程序回显的字符。 (请注意,如果输入<Backspace>或其他......字符将被删除。当您键入<Enter>时,Java不会看到退格等。它们已被删除。)

  3. 通过java.io.Console类输入的行为方式相同。

  4. 在Windows上也是如此:行为是可移植的。 (这是一件好事...)

  5. 如果您希望Java应用程序在键入字符时查看字符,则在键入字符时,您需要使用第三方库(或本机代码)来实现此功能。 (在Linux中,它需要将tty驱动程序切换到“原始”模式......并且此功能是不可移植的,标准Java SE不支持。)