簡體   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