Я использую стороннюю библиотеку, которая использует 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();
}
Как видите, расширение этих классов не поможет, поскольку они являются единственными конструкторами в этих классах.
Я не хочу использовать отражение или манипулирование байт-кодом.
Любая помощь приветствуется.