Ходьба 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 и его подпапке.

Список.zip каталогов без распаковки

Другие вопросы по тегам