Javaには2つのスレッドがあります。
最初のスレッドが bufferedreader を閉じています ( br.close()
)
2 番目のスレッドが同じリーダーで読み取りを行うと、IOException (Stream Closed)
使用してもこの例外が発生しますbr.ready()
ストリームが既に閉じられているかどうかを知る方法はありますか?
Javaには2つのスレッドがあります。
最初のスレッドが bufferedreader を閉じています ( br.close()
)
2 番目のスレッドが同じリーダーで読み取りを行うと、IOException (Stream Closed)
使用してもこの例外が発生しますbr.ready()
ストリームが既に閉じられているかどうかを知る方法はありますか?
メソッドready()
が閉じられると、例外がスローされます。ただし、クローズド チェック メソッドを追加したとしても、ロックが呼び出し間で解放されている限り (これは のためですBufferedReader
)、リーダーはそれを読み取るまでに閉じられている可能性があります。
次の 3 つのオプションが表示されます。
BufferedReader
拡張するサブクラスを作成します。close()
これには、 をスローする以外に何かしたい場合は、閉じたリーダーで必要な動作を行うために多くのメソッドをオーバーライドする必要もありますIOException
。ready()
化することができます。read()
すでに読み取り操作を開始している場合は、ストリームが閉じられたことをIOExceptionで通知されます。以前にbr.ready()を呼び出したことがある場合でも、コードがreadメソッドでブロックされると例外が発生します。
これを回避する方法はありません。逆に、読み取り操作で例外がスローされ、それを適切に処理できるように準備する必要があります。
もう 1 つの方法は、独自のクラスで BufferedReader を拡張し、close() メソッドをオーバーライドして、それが閉じられたかどうかを示すことです。
ストリームが閉じているかどうかを直接呼び出すことができるメソッドはないと思います。
このリーダーを共有する 2 つのスレッドが本当に必要な場合は、1 つのスレッドが他のスレッドにコールバックするか、ストリームが閉じられたことを通知するフラグを設定して、他のスレッドが試行しないことを認識できるようにすることをお勧めします。それから読んでください。
実際、ensureOpen()を見ると、inオブジェクトがnullでないかどうかがチェックされます。プライベートのため、外部からはアクセスできません。ただし、本当に必要な場合は、リフレクションを使用できます。
BufferedReader myBR = new BufferedReader(new FileReader("c:/somefile.txt"));
myBR.close();
Class c = myBR.getClass();
Field in = c.getDeclaredField("in");
in.setAccessible(true);
Object inReader = in.get(myBR);
if(inReader == null){
System.out.println("is closed");
}
else{
System.out.println("is open");
}
BufferedReader から読み取ってそれを閉じるものだけがスレッドである場合、Reader を閉じるときに同期セクションを作成し、いくつかのフラットを設定します。したがって、各スレッドで次のことを行う必要があります。
注意して、同期セクションでハングする可能性のあるものは避けてください。基本的には必要なものだけを入れて、データだけを読み込んで後から処理する。