问题描述
我正在研究将压缩文件转换为常规java.io.File的方法,所有文件和文件夹的顺序与zip中的顺序相同。基本上,我只想解压缩压缩文件而不将其内容复制到新目的地。到目前为止,我已经想出了此功能,但仅当zip中没有文件夹时,该功能才能很好地工作。 zip中的文件不能是目录,否则我的功能将不起作用,这就是问题所在。
这是我的功能:
self.root
如何处理zip中的文件夹?还是有比将zip转换成java.io.File更好的方法呢?
请帮忙!
解决方法
找到目录后,您只需要多一点即可设置目录。或者在复制文件之前使用一行newFile.mkdirs()
创建所需的目录,或者在entry.isDirectory()
时在其他目录中创建目录结构:
//What to do if there are folders in zip...
System.out.println("Reading dir "+entry.getName());
File newDir = new File(helperDir,entry.getName());
newDir.mkdirs();
上述3行比较好,因为它可以复制空目录,而仅添加newFile.mkdirs()
只会创建其中包含文件的目录。
Java NIO提供了一种执行相同解压缩操作的好方法,下面是一个示例:
public static void unzip(Path zip,Path dir) throws IOException {
try (FileSystem fs = FileSystems.newFileSystem(zip)) {
for (Path root : fs.getRootDirectories()) {
BiPredicate<Path,BasicFileAttributes> foreach = (p,a) -> {
copy(p,a,Path.of(dir.toString(),p.toString()));
return false;
};
Files.find(root,Integer.MAX_VALUE,foreach).count();
}
}
System.out.println("UNZIPPED "+zip +" to "+dir);
}
private static void copy(Path from,BasicFileAttributes a,Path target) {
System.out.println("Copy "+(a.isDirectory() ? "DIR " : "FILE")+" => "+target);
try {
if (a.isDirectory())
Files.createDirectories(target);
else if (a.isRegularFile())
Files.copy(from,target,StandardCopyOption.REPLACE_EXISTING);
}
catch (IOException e) {
throw new UncheckedIOException(e);
}
}