Утечка дескриптора файла в сторонней библиотеке Java - PullRequest
0 голосов
/ 24 декабря 2018

Я использую стороннюю библиотеку, которая использует 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();
}

Как видите, расширение этих классов не поможет, поскольку они являются единственными конструкторами в этих классах.

Я не хочу использовать отражение или манипулирование байт-кодом.

Любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...