我一直在使用 Java 7 的 ZipFS 支持。
https://gist.github.com/stain/5591420
显示行为,我觉得有点奇怪。基本上,您可以创建一个 ZIP 文件系统,创建一个具有给定名称的文件,然后还创建一个具有相同名称的文件夹。
这样做的原因似乎是在内部文件夹在其名称后面附加了“/” - 但是这个新名称没有返回,因此您最终会遇到一个奇怪的情况,即 Files.isDirectory() 在成功完成文件后立即返回 false。创建目录()。
try (FileSystem fs = tempZipFS()) {
Path folder = fs.getPath("folder");
Files.createFile(folder);
assertTrue(Files.isRegularFile(folder));
assertFalse(Files.isDirectory(folder));
// try {
Files.createDirectory(folder);
// } catch (FileAlreadyExistsException ex) {
// Is not thrown!
// }
// but a second createDirectory() fails correctly
try {
Files.createDirectory(folder);
} catch (FileAlreadyExistsException ex) {
}
// Look, it's both a file and folder!
Path child = folder.resolve("child");
Files.createFile(child);
// Can this be tested?
assertTrue(Files.isRegularFile(folder));
// Yes, if you include the final /
assertTrue(Files.isDirectory(fs.getPath("folder/")));
// But not the parent
// assertTrue(Files.isDirectory(child.getParent()));
// Or the original Path
// assertTrue(Files.isDirectory(folder));
}
因此,只要您有“/”作为后缀,您甚至可以同时使用两者,如果您对根目录进行目录列表,这就是它们的列出方式。
现在 ZIP 格式本身允许这样做,因为它只处理 ZIP 文件中的条目(甚至允许多个具有相同名称的条目),但是正常使用“文件系统”通常不允许多个具有相同名称的条目;当我尝试创建文件夹两次时可以看出。
生成的 ZIP 文件可以用 infozip、7Zip 和 Windows 8 正确浏览;但是尝试解压缩显然会失败,因为本机文件系统不支持这种二元性。
那么这是一个功能,错误还是介于两者之间的东西?