FileOutputStream try-with-resources не закрывает файловый дескриптор - PullRequest
5 голосов
/ 16 апреля 2019

У меня есть код, который извлекает некоторые конкретные большие (около 15 тыс. Записей) двоичные сериализованные архивные файлы в папку на диске.

public void extractExact(Path absolutePath, DoubleConsumer progressConsumer) throws IOException
{
    ...
    // Extract to file channel
    try (final FileOutputStream fos = new FileOutputStream(absolutePath.toFile()))
    {
        PakExtractor.Extract(pakFile, Entry, fos.getChannel(), progressConsumer);
    }
 }

extractExact вызывает функцию для каждой записи в архиве.

после этого, если я попытаюсь вызвать Files.delete(<archive_file_path>) метод - я получу исключение:

java.nio.file.FileSystemException: процесс не может получить доступ к файлу, потому что он используется другимprocess.

Я проверил свой архивный файл в поиске Process Explorer, и он говорит, что у меня есть ~ 15k открытий файлов моим java.exe (столько же, сколько файлов в архиве)

это происходит только в Windows (jdk1.8.0_162).В Linux у меня нет проблем с "зомби" открытыми файлами.

1 Ответ

2 голосов
/ 17 апреля 2019

Наконец - мы нашли решение.Большое спасибо @Netherwire. FileChannel класс имеет метод map, который выполняет некоторые неявные операции копирования с файловыми дескрипторами, поэтому будьте осторожны при его использовании. Здесь - дополнительная информация.

...