2011-09-08 41 views
3

我在玩弄一些小小的命令行遊戲,以鞏固我在過去幾個月中學習過的Java中的一些東西。在Java中多次讀取System.Exception會導致IOException?

我想創建一個名爲readInput()的方法,它返回一個字符串,我可以一次又一次地調用它。它第一次完美的工作,但第二次,它會導致一個IO.Exception。如果我刪除語句bisr.close();它的工作原理,但教會關閉溪流,因爲這是不好的做法,讓他們打開。

有人可以指點我在正確的方向,因爲我GOOGLE了但無濟於事。

的方法...

private String readInput() 
{ 
    String input = null; 
    BufferedReader bisr = null; 
    try 
    { 
     bisr = new BufferedReader(new InputStreamReader(System.in)); 
     input = bisr.readLine(); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Error: " + e); 
    } 
    finally 
    { 
     try 
     { 
      bisr.close(); 
     } 
     catch (Exception e) 
     { 
      System.out.println("Error:" + e); 
     } 
     return input; 
    } 
} 

回答

7

的問題是,關閉BufferedReader也會自動關閉它隱式地關閉System.inInputStreamReader

而您第二次調用該方法System.in已關閉,這意味着您將無法讀取它。

「永遠關閉它」僅適用於您也打開的資源!

+0

好了解。謝謝 – Tomeh

7

第一次它完美的作品,第二次但它會導致IO.Exception

bisr.close()也將接近基礎輸入流(在這種情況下爲System.in)。這就是連續讀取會導致IOException的原因。

如果我刪除了語句bisr.close();它的工作原理,但被教導要關閉流,因爲它是不好的做法,讓他們開

沒問題,在保持System.in開放的執行時間。

如果您不想創建不必要的許多對象,您可以創建一次BufferedReader,然後傳遞它。

對於這種特殊情況,我可能只是去與

private String readInput() { 
    return new Scanner(System.in).nextLine(); 
} 
+0

對是看起來要好得多,是有道理的。 Thankyou – Tomeh

+0

沒問題,不客氣。 (掃描儀是在java.util btw) – aioobe

0

對於System.in,最好有一次創建的全局BufferedReader或Scanner。這是因爲BufferedReader和Scanner可以讀取多條緩衝區以提高性能,因此您可能會丟棄某些行或部分行。

public static void main(String... args) throws InterruptedException { 
    for(int i=0;i<5;i++) { 
    System.out.println("\nread "+readLine()); 
    // give me time to write more than one line, no problem from a file. 
    Thread.sleep(1000); 
    } 
} 

public static String readLine() { 
    // can lose input. 
    return new Scanner(System.in).nextLine(); 
} 

如果我很快地在關鍵字中輸入數字1,2,3等。

1 

read 1 
2 
3 
4 
read 2 

5 
6 
7 
read 4 

8 
9 
0 
read 7 

- 
= 

read 0 

如果我使用全局掃描儀對象並執行相同的操作。

static final Scanner IN = new Scanner(System.in); 

public static void main(String... args) throws InterruptedException { 
    for (int i = 0; i < 10; i++) { 
    System.out.println("\nread " + readLine()); 
    // give me time to write more than one line, no problem from a file. 
    Thread.sleep(1000); 
    } 
} 

public static String readLine() { 
    return IN.nextLine(); 
} 

打印

1 

read 1 
2 
3 
4 
read 2 

5 
6 
read 3 

7 
8 

read 4 
9 

read 5 
0 

read 6 

read 7 

read 8 

read 9 

read 0 
相關問題