我知道System類的System.in是InputStream的具體子類的一個實例,因爲InputStream的read()方法是抽象的, System.in必須重寫此方法。 根據有關的InputStream的read()方法的文件:)關於Java中System.in的read()方法的行爲的迷惑
公共抽象INT讀(拋出IOException異常
中讀取數據的從輸入流的下一個字節。值字節在0到255範圍內作爲int返回。如果由於已到達流末尾而沒有可用的字節,則返回值-1。此方法阻塞直到輸入數據可用,流的末尾被檢測到,或拋出異常。
子類必須提供此方法的實現。返回:
數據的下一個字節,如果到達流的末尾,則返回-1。拋出:
IOException - 如果發生I/O錯誤。
如果到達流的末尾,則read()方法應返回-1。我的問題是,什麼時候System.in.read()返回-1?
下面是示例代碼:
import java.io.*;
class SystemInTest{
public static void main(String[] args) throws IOException{
InputStream in = System.in;
//InputStream in = new FileInputStream("h.txt");
int ch = 0;
while((ch = in.read()) != -1){
System.out.println(ch);
}
}
}
運行該代碼,並輸入 「ABC」,然後是 「輸入」,結果是(在Linux):
97
98
99
10
然後應用程序被阻止並等待另一個輸入。但我認爲while循環「ch = in.read()」中的語句應該繼續運行,並在讀取行終止字符並在控制檯上打印10後返回-1。如果是這樣,應用程序應該被終止。但它被阻止。
作爲比較,如果我取消註釋註釋行,使用內容爲「abc \ n」作爲字節輸入流的文件,則應用程序因期望而終止,因爲返回-1。
System.in.read()是否真的返回-1?如果是這樣,爲什麼System.in中的read()方法的實現與InputStream的其他子類(如FileInputStream)不同?
按下ctrl-D(可能兩次)關閉輸入流。如果你沒有真正關閉流,你不在EOF。 –
僅當輸入實際結束時,例如'echo abc | java SystemInTest' – zapl
你的建議會阻止任何程序從命令行讀取多行。流不關閉。它只是等待你輸入下一個字符。例如,如果您使用'java MyClass