如何知道BufferedReader Stream是否已关闭

时间:2009-06-11 13:49:46

标签: java io bufferedreader

我在Java中有两个线程。

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

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

即使我使用br.ready()

,我也会收到此异常

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

6 个答案:

答案 0 :(得分:8)

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

我看到三个选项:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

 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");
 }

答案 5 :(得分:0)

如果只有从BufferedReader读取并关闭它的东西是你的线程,我只会制作同步部分并在关闭Reader时设置一些平面。所以在每个帖子中你应该:

  1. 打开同步部分。
  2. 检查流是否已经关闭(检查标志)。
  3. 从溪流中读取。
  4. 关闭流。
  5. 设置标志。
  6. 结束同步部分。
  7. 小心并避免任何可能在同步部分中挂起的内容。基本上只在那里放置必要的东西,只读取数据,稍后再处理。