Ходьба filetree выдает ошибку, даже если файлы должны существовать
Я пытаюсь пройтись по zip-файлу и распечатать все файлы, но по какой-то причине он выбрасывает NoSuchFileException
как только он перейдет в любую подпапку.
FileSystem fs = FileSystems.newFileSystem(Paths.get(folder.getRoot().getAbsolutePath(), "test.zip"), null);
Files.walkFileTree(fs.getPath("/"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println(exc);
return FileVisitResult.CONTINUE;
}
});
Почему это даже хочет пойти туда, если они не существуют? Может кто-нибудь помочь мне решить эту проблему? Файлы на самом деле должны быть там, по крайней мере, они делают, когда тест выполняется вручную.
2 ответа
Будьте особенно осторожны при использовании FileSystem
реализации, так как они особенно зависят от используемой вами JVM и от ОС! Ср Javadoc файловой системы
Очень хороший пример - ZipFileSystem. Его девичья фамилия com.sun.nio.zipfs.ZipFileSystem
, но IBM JRE имеет свою собственную реализацию в com.ibm.ws.install.ni.framework.io.ZIPFileSystem
, Также, например, из ZIP-файла вы не можете получить доступ к внутренним ZIP-файлам из-за расположения архива. Вы должны распаковать его и смонтировать внутренний ZIP как другой FileSystem
, (После этого, конечно, вы должны удалить их)
И, конечно, посмотрите на этот ТАК ответ: вероятно, ваши ожидания ложны. Отладка, где именно происходит исключение и соотнесите это с вашими ожиданиями.
Если я выполню этот код, он просто работает для меня:
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.zip.*;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
try (ZipFile zipFile = new ZipFile("logs\\subfolder\\subsubfolder\\logs.zip")) {
zipFile.stream()
.map(ZipEntry::getName)
.forEach(System.out::println);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Path fs = FileSystems.getDefault().getPath("logs", "");
//
// System.out.println(fs.toAbsolutePath());
//
// SimpleFileVisitor<Path> sfv = new SimpleFileVisitor<Path>() {
// @Override
// public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
// System.out.println(file.toAbsolutePath());
// return FileVisitResult.CONTINUE;
// }
//
// @Override
// public FileVisitResult visitFileFailed(Path file, IOException exc) {
// System.err.println(exc);
// return FileVisitResult.CONTINUE;
// }
//
// };
//
// try {
// Files.walkFileTree(fs, sfv);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
это изображение структуры каталогов проекта в eclipse:
В каталоге logs находится файл с именем access.log.
и это мой вывод консоли:
access.log
Microsoft Access Database (neu).accdb
Microsoft Excel-Arbeitsblatt (neu).xlsx
test/Microsoft Access Database (neu).accdb
test/Microsoft Excel-Arbeitsblatt (neu).xlsx
Все файлы, которые находятся в Zip и его подпапке.