我正在尝试浏览一个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;
}
});
如果它们不存在,它怎么会想去那里?任何人都可以帮我解决这个问题吗?这些文件实际应该在那里,至少他们在手动执行测试时会这样做。
答案 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();
// }
}
}
日志目录中有一个名为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及其子文件夹中的所有文件。