2016-04-14 16 views
2

同じメソッドで2つのクラスを使用してコンソールから入力を読み取ろうとしていますInputStreamReaderおよびBufferedReader私は以前のクラスのストリームを閉じて、入力をもう一度読んだが、後者のクラスを使用しています。 BufferedReaderストリームのread()メソッドを呼び出す前に、以前のクラスストリームを閉じると、エラーが表示されます。しかし、メソッドの最後にInputStreamReaderストリームを閉じると、正常に動作しています。複数のストリームを閉じて同じファイルで開くエラー

私の考えは- です。前者のストリームを閉じたので、後者のストリームは独立しているので、コードの実行には影響しません。上記の行で

public static void main(String[] args) throws Exception { 


    //File file = new File("D:\\IOSUMIT\\new_file.txt"); 

    InputStreamReader isr= new InputStreamReader(System.in); 

    System.out.println("your input " + (char)isr.read()); 



    isr.close(); //here error occurs 


    InputStreamReader isrp= new InputStreamReader(System.in); // Line 1 

    BufferedReader br = new BufferedReader(isrp); 
    int temp = br.read(); 

    System.out.println("your input Buffered" + (char)temp); 



    br.close(); 

出力誤差

your input 4Exception in thread "main" java.io.IOException: Stream closed 
    at java.io.BufferedInputStream.getBufIfOpen(Unknown Source) 
    at java.io.BufferedInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.read(Unknown Source) 
    at IO.Q7.main(Q7.java:60) 
+0

"これはエラーを表示しています" stacktrace? –

答えて

3

再度開くことができないがこれを起動します:

isr.close(); //here error occurs 

エラーが発生した場合、実際にそれはありません。それは赤いニシンです。 stacktraceによれば、例外は実際に次の文によってスローされます。

int temp = br.read(); 

これは意味があります。 isr.close()は、それがラップするReaderと入力ストリームの両方を閉じています。その入力ストリームはSystem.inストリームです。

したがって、2番目のInputStreamReaderBufferedReaderを作成すると、以前閉じたストリームがラッピングされます。

したがって、新しい読者から読もうとすると例外が発生します。

解決方法:閉じると、System.inストリームは閉じたままです。だからSystem.inを閉じないでください。


あなたは尋ねた:

を入力ストリームがBufferReaderコンストラクタ内でコメント行1で再度開くことはないでしょうか?

InputStreamReader isrp= new InputStreamReader(System.in); // Line 1 

短い答え:いいえ

newSystem.inの現在の値をラップする新しいInputStreamReaderインスタンスを作成しています。この場合、その値は、前に閉じたファイル記述子0 ...のFileInputStreamオブジェクトの参照です。

1
InputStreamReader isr= new InputStreamReader(System.in); 

、ISRは、(キーボードのような入力ソースから)入力ストリームリーダとして作用する基準です。だから一度閉じると、実際の入力ストリームが閉じられます。 isrが閉じているわけではありません。

InputStreamReader isrp= new InputStreamReader(System.in); 

別の参照(ISRP)は直前のストリームにバッファリングされリーダーを作成する前に閉じられたことストリームを使用しようとし、したがってさらなる読み取りは、システム上、標準的な入力ストリームとして(許されません。はすでに閉鎖されています)。

また、同じ入力ソースに対して2つの入力ストリームを使用することを考えるのは難しい考えです。開いている入力ストリームでバッファリングされたリーダーを使用する必要があります。あなたがあなたの全体入力を読んだ後でさえ、ストリームだけを閉じなければなりません。線が実際に実行される

isr.close(); //here error occurs 

は、入力ストリームが閉じ、緩衝リーダが閉じストリームを見つけることができないと

+0

BufferReaderコンストラクタ内のコメント行1でストリームを再度開く必要はありませんか?参照isrpは** new **を使用しているので、previousを使用するのではなく、新しいものを作成します。 – angrysumit

+1

@angrysumit - いいえ、第2段落ですでに答えたように、入力ストリームは標準入力(System.in)で閉じられます。これは2行目で開こうとしているものと同じです。入力ストリームとして機能するために、ファイルのような他の入力を使用することができます。しかし、この同じ標準入力ストリームは再び開かれません。そして、これはその例外をスローします( 'java.io.IOException:Stream closed')。 –

1

問題があります。あなたができる修正は、閉じた行をコメントアウトし、すべての計算の後に実行することです。 入力ストリームが閉じられると、それは再び

関連する問題