[英]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來到達流的末尾嗎? 有沒有辦法實現我的期望?
提前致謝
正如EJP所說,這與InputStream / BufferedReader無關。 您將看到Linux“ tty”輸入驅動程序的行為以及一個典型的控制台命令。
您所看到的是正常的“行編輯”或“行緩沖”。 當按下<Enter>
鍵時,輸入僅可用於Java讀取(通過stdin文件描述符)。 之前看到的輸出是從“ tty”驅動程序回顯的字符。 (並且請注意,如果輸入<Backspace>
或任何...,字符將被刪除。當您鍵入<Enter>
,Java將看不到退格鍵等。它們已被編輯。)
通過java.io.Console
類進行的輸入行為相同。
在Windows上是相同的:行為是可移植的。 (這是一件好事...)
如果希望Java應用程序在鍵入字符時看到它們,則在鍵入字符時,需要使用3rd-party庫(或本機代碼)來實現。 (在Linux中,這需要將tty驅動程序切換為“原始”模式...並且此功能是不可移植的,並且標准Java SE不支持。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.