Не удаляется файл 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();
}
Вы либо обрабатываете исключение (исправляете возникшую ошибку), либо пробрасываете его, если не можете исправить. Прятать исключение - плохая идея: работает все некорректно, а отловить проблему сложно