如何知道BufferedReader Stream是否已关闭

我在Java中有两个线程。

第一个线程正在关闭bufferedreader( br.close()

当第二个线程在同一个读取器上读取时,我得到一个IOException (Stream Closed)

即使我使用br.ready()我也会遇到此exception

有没有办法知道流是否已经关闭?

如果关闭,方法ready()将抛出exception。 但即使您添加了一个封闭的检查方法,只要在调用之间释放锁定(对于BufferedReader ),读取器可能会在您读取时关闭。

我看到三个选项:

  1. 用try / catch块包装你的read调用来处理已关闭的case。
  2. 创建BufferedReader的子类,扩展close()以设置您自己的变量,该变量可用于检查读取器是否已关闭。 如果你想在抛出IOException做一些事情,这还需要覆盖很多方法,以便用一个封闭的阅读器做你想要的任何行为。
  3. 添加一个自己的锁并使用它来关闭阅读器(一个线程)并检查缓冲区是否准备就绪并从中读取。 您可以直接为检查设置变量,也可以将ready()read()调用分组到同一个同步块中。

我认为没有任何方法可以直接调用来判断流是否已关闭。

如果你真的需要有两个线程共享这个阅读器,你最好的选择可能是让一个线程回调给另一个线程或设置一个标志来通知它该流已被关闭,所以另一个线程知道不要尝试从中读取。

如果您已经启动了读取操作,那么您将收到IOException通知流已关闭。 即使您之前调用了br.ready(),当您的代码在read方法中被阻止时,也会发生exception。

没有办法避免这种情况。 相反,您应该期望读取操作抛出exception并准备好适当地处理它。

另一种方法是在您自己的类中扩展BufferedReader,重写close()方法以指示它是否已关闭。

实际上,查看ensureOpen()会检查in对象是否为null。 由于它是私人的,我们无法从外部访问它。 但如果你真的需要它,你可以使用reflection。

  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时设置一些平面。 所以在每个线程中你应该:

  1. 打开同步部分。
  2. 检查流是否尚未关闭(检查标志)。
  3. 从流中读取。
  4. 关闭流。
  5. 设置标志。
  6. 结束同步部分。

只是要小心,避免任何可能挂在同步部分。 基本上只在那里放置必要的东西,只读取数据,以后再处理。