0

我正在尝试浏览一个 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;
        }

    });

如果它们不存在,它怎么还想去那里?谁能帮我解决这个问题?这些文件实际上应该在那里,至少在手动执行测试时它们确实存在。

4

2 回答 2

0

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

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

当然看到这个答案:可能你的期望是错误的。调试异常发生的确切位置并将其与您的期望相关联。

于 2017-12-06T13:16:35.843 回答
-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 中项目目录结构的图像: 在此处输入图像描述

在日志目录中有一个名为 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 目录而不解压缩

于 2017-12-06T13:36:00.623 回答