我有两个Java线程。
第一个线程正在关闭一个bufferedreader (br.close()
)
当第二个线程在同一个reader上进行读取时,会出现IOException(流已关闭)
即使我使用br.ready()
也会出现此异常。
是否有一种方法可以知道该流是否已关闭?
我有两个Java线程。
第一个线程正在关闭一个bufferedreader (br.close()
)
当第二个线程在同一个reader上进行读取时,会出现IOException(流已关闭)
即使我使用br.ready()
也会出现此异常。
是否有一种方法可以知道该流是否已关闭?
ready()
会在关闭时抛出异常,但即使添加了一个检查已关闭的方法,只要在调用之间释放锁(对于BufferedReader
而言是这样),读取时读者可能已经关闭。BufferedReader
子类,扩展close()
,将其设置为自己的变量,
可以用来检查读取器是否已关闭。如果您想让其除了抛出IOException
之外执行其他操作,则需要重写很多方法。ready()
和read()
调用分组到同一同步块中。我认为没有任何直接调用的方法可以告诉你一个流是否已关闭。
如果你真的需要两个线程共享这个读取器,你最好的选择可能是让一个线程回调另一个线程或设置一个标志来通知它流已经关闭,以便另一个线程知道不要尝试从中读取。
如果您已经开始了读取操作,那么您将会收到一个IOException通知流已关闭。即使您之前调用了br.ready()方法,在代码被阻塞在read方法时仍然会发生异常。
没有办法避免这种情况。相反,您应该预期读取操作会抛出异常,并准备妥善处理它。
确实,查看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");
}
如果只有从BufferedReader读取并关闭它的线程,我会创建同步块并在关闭Reader时设置一些标志。因此,在每个线程中,您应该:
只需小心并避免在同步块中出现任何可能挂起的情况。基本上,只需放入必要的内容,仅读取数据,稍后再处理。