繁体   English   中英

java InputStreamReader / BufferedReader的“读取”行为

[英]java InputStreamReader / BufferedReader “read” behavior

一个相关的问题是: 为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. 正如EJP所说,这与InputStream / BufferedReader无关。 您将看到Linux“ tty”输入驱动程序的行为以及一个典型的控制台命令。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM