0

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

提前致谢

4

1 回答 1

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

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

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

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

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

于 2014-08-20T01:28:22.213 回答