2011-09-08 44 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