14

Javaには2つのスレッドがあります。

最初のスレッドが bufferedreader を閉じています ( br.close())

2 番目のスレッドが同じリーダーで読み取りを行うと、IOException (Stream Closed)

使用してもこの例外が発生しますbr.ready()

ストリームが既に閉じられているかどうかを知る方法はありますか?

4

6 に答える 6

8

メソッドready()が閉じられると、例外がスローされます。ただし、クローズド チェック メソッドを追加したとしても、ロックが呼び出し間で解放されている限り (これは のためですBufferedReader)、リーダーはそれを読み取るまでに閉じられている可能性があります。

次の 3 つのオプションが表示されます。

  1. クローズされたケースを処理するために、読み取り呼び出しを try/catch ブロックでラップします。
  2. リーダーが閉じているかどうかを確認するために使用できる独自の変数を設定するためにBufferedReader拡張するサブクラスを作成します。close()これには、 をスローする以外に何かしたい場合は、閉じたリーダーで必要な動作を行うために多くのメソッドをオーバーライドする必要もありますIOException
  3. 独自のロックを追加し、それを使用してリーダー (1 つのスレッド) を閉じ、バッファーの準備ができてそこから読み取られることを確認します。チェック用に変数を直接設定するか、または呼び出しを同じ同期ブロックにグループready()化することができます。read()
于 2009-06-11T15:23:30.553 に答える
1

すでに読み取り操作を開始している場合は、ストリームが閉じられたことをIOExceptionで通知されます。以前にbr.ready()を呼び出したことがある場合でも、コードがreadメソッドでブロックされると例外が発生します。

これを回避する方法はありません。逆に、読み取り操作で例外がスローされ、それを適切に処理できるように準備する必要があります。

于 2009-06-11T14:01:49.423 に答える
1

もう 1 つの方法は、独自のクラスで BufferedReader を拡張し、close() メソッドをオーバーライドして、それが閉じられたかどうかを示すことです。

于 2009-06-11T15:26:30.953 に答える
1

ストリームが閉じているかどうかを直接呼び出すことができるメソッドはないと思います。

このリーダーを共有する 2 つのスレッドが本当に必要な場合は、1 つのスレッドが他のスレッドにコールバックするか、ストリームが閉じられたことを通知するフラグを設定して、他のスレッドが試行しないことを認識できるようにすることをお勧めします。それから読んでください。

于 2009-06-11T14:01:07.833 に答える
0

実際、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");
 }
于 2009-06-11T14:36:27.687 に答える
0

BufferedReader から読み取ってそれを閉じるものだけがスレッドである場合、Reader を閉じるときに同期セクションを作成し、いくつかのフラットを設定します。したがって、各スレッドで次のことを行う必要があります。

  1. 同期セクションを開きます。
  2. ストリームがまだ閉じられていないかどうかを確認します (フラグを確認してください)。
  3. ストリームから読み取ります。
  4. ストリームを閉じます。
  5. フラグを設定します。
  6. 同期セクションを終了します。

注意して、同期セクションでハングする可能性のあるものは避けてください。基本的には必要なものだけを入れて、データだけを読み込んで後から処理する。

于 2009-06-11T20:39:02.683 に答える