即使文件应该存在,行走文件树也会引发错误

时间:2017-12-06 12:54:43

标签: java file filesystems java.nio.file

我正在尝试浏览一个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 个答案:

答案 0 :(得分:0)

在使用FileSystem实现时要格外小心,因为它们特别依赖于您正在使用的JVM,操作系统上的!参看Javadoc of FileSystem

一个非常好的例子是ZipFileSystem。它的处女名是com.sun.nio.zipfs.ZipFileSystem,但IBM JRE在com.ibm.ws.install.ni.framework.io.ZIPFileSystem中有自己的实现。另外,例如,从ZIP文件中,由于存档的布局,您无法访问内部ZIP。您必须解压缩它,并将内部ZIP安装为另一个FileSystem。 (之后,当然,你必须删除这些)

当然看this SO answer:可能你的期望是假的。调试异常发生的位置并将其与您的期望相关联。

答案 1 :(得分:-1)

如果我执行此代码,它对我有效:

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中项目目录结构的图像: enter image description here

日志目录中有一个名为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及其子文件夹中的所有文件。

List .zip directories without extracting