Не удаляется файл java после распаковки

У меня есть функция, в которую подаются 2 параметра: Файл архива и директория его распаковки. После распаковки архива сам архив должен удаляться, но, не смотря на то, что он должен, он не удаляется. 2-й день сижу ломаю голову, никак не могу понять, где я накосячил. Функция:

public static void unzip(File source, String out){

        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(source))) {
            ZipEntry entry = zis.getNextEntry();
            while (entry != null) {
                File file = new File(out, entry.getName());
                System.out.println("Разархивируем: " + entry.getName());
                if (entry.isDirectory()) {
                    file.mkdirs();
                } else {
                    File parent = file.getParentFile();
                    if (!parent.exists()) {
                        parent.mkdirs();
                    }
                    try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
                        int bufferSize = Math.toIntExact(entry.getSize());
                        byte[] buffer = new byte[bufferSize > 0 ? bufferSize : 1];
                        int location;
                        while ((location = zis.read(buffer)) != -1) {
                            bos.write(buffer, 0, location);
                        }
                    }
                }
                entry = zis.getNextEntry();
            }

            zis.closeEntry();

            source.delete(); // НА ЭТОМ МОМЕНТЕ ФАЙЛ ДОЛЖЕН УДАЛИТЬСЯ
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

Ответы (1 шт):

Автор решения: Дмитрий

А чего тут ломать голову? Вы когда-то пробовали открыть, к примеру, текстовый файл, а потом, не закрывая его, удалить? Могу поспорить, что у вас это не получится. Здесь вы пытаетесь сделать тоже самое. Конструкция try-with-resources призвана закрывать потоки, когда их использование завершиться. В этой строке вы используете данную конструкцию для своего архива : try (ZipInputStream zis = new ZipInputStream(new FileInputStream(source))) Посмотрите, где закрывается фигурная скобка данного блока try. Именно в этот момент вы закончите работу с архивом и поток будет закрыт. А теперь посмотрите в какой момент вы пытаетесь удалить архив. Правильно, до закрытия потока, открытого блоком try. Поэтому в доступе к файлу вам система отказывает и ничего не удаляется. Достаточно вынести удаление за пределы блока try и все заработает:

public static void unzip(File source, String out) throws IOException {

try (ZipInputStream zis = new ZipInputStream(new FileInputStream(source))) {
    ZipEntry entry = zis.getNextEntry();
    while (entry != null) {
        File file = new File(out, entry.getName());
        System.out.println("Разархивируем: " + entry.getName());
        if (entry.isDirectory()) {
            file.mkdirs();
        } else {
            File parent = file.getParentFile();
            if (!parent.exists()) {
                parent.mkdirs();
            }
            try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
                int bufferSize = Math.toIntExact(entry.getSize());
                byte[] buffer = new byte[bufferSize > 0 ? bufferSize : 1];
                int location;
                while ((location = zis.read(buffer)) != -1) {
                    bos.write(buffer, 0, location);
                }
            }
        }
        entry = zis.getNextEntry();
    }

    zis.closeEntry();

} 
source.delete(); // НА ЭТОМ МОМЕНТЕ ФАЙЛ ДОЛЖЕН УДАЛИТЬСЯ

}

И еще... Писать такие конструкции бессмысленно:

} catch (IOException e) {
    e.printStackTrace();
}

Вы либо обрабатываете исключение (исправляете возникшую ошибку), либо пробрасываете его, если не можете исправить. Прятать исключение - плохая идея: работает все некорректно, а отловить проблему сложно

→ Ссылка