我正在使用使用RandomAccesFile
的第三方库。在其中一个构造函数中,它打开文件(检索描述符),然后尝试读取标头。如果在读取标题时发生异常,则不会关闭在上一步中打开的RandomAccesFile
,并且文件描述符将一直保留到GC完成其工作为止。
我不能依靠GC来收集未引用的RandomAccesFile
实例来清除文件描述符,因为此问题与内存使用无关。
即使我想自己关闭RandomAccesFile
,我也无法访问它,因为打开RandomAccesFile
的对象由于其构造函数中的异常而从未创建。
这是库中的两个构造函数:
我正在创建FileObjectQueue
实例
public FileObjectQueue(File file, FileObjectQueue.Converter<T> converter) throws IOException {
this.file = file;
this.converter = converter;
this.queueFile = new QueueFile(file);
}
它会创建QueueFile
,这会导致泄漏。
final RandomAccessFile raf;
public QueueFile(File file) throws IOException {
if (!file.exists()) {
initialize(file);
}
this.raf = open(file);
this.readHeader();
}
如您所见,扩展这些类将无济于事,因为它们是这些类中唯一的构造函数。
我不想使用反射或字节码操作。
感谢您的帮助。