2016-06-10 61 views
6

我知道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)不同?

+0

按下ctrl-D(可能兩次)關閉輸入流。如果你沒有真正關閉流,你不在EOF。 –

+2

僅當輸入實際結束時,例如'echo abc | java SystemInTest' – zapl

+0

你的建議會阻止任何程序從命令行讀取多行。流不關閉。它只是等待你輸入下一個字符。例如,如果您使用'java MyClass

回答

1

輸入流沒有固定的大小,所以你的程序進入無限循環並且一次又一次地請求輸入。 但是,h.txt文件具有固定的大小,因此正在終止。

4

Enter只意味着您完成了一行,並不意味着您完成了整個「文件」。

如何完成文件取決於操作系統。在Linux上,它是Ctrl+D,您可以在許多程序中使用它們來退出它們(而不是鍵入exitquit)。在Windows上,它是Ctrl+Z