我已经使用java 7提供的FileSystem
成功地修改了一个(现有的)zip文件的内容,但当我试图用这种方法创建一个新的zip文件时,它失败了,错误消息是:"zip END header not found"
,这是合乎逻辑的,因为我这样做,首先我创建了一个完全空的文件(Files.createFile
),然后我试图访问它的文件系统,由于文件是空的,不可能在zip中找到任何标头,我的问题是有没有办法使用这种方法创建一个完全空的新zip文件?;我考虑过的破解方法是在zip文件中添加一个空的新ZipEntry
,然后使用这个新的空文件来封装基于它的文件系统,但我真的想oracle的人用nio和文件系统实现了一种更好(更容易)的方法。。。
这是我的代码(创建文件系统时出现错误):
if (!zipLocation.toFile().exists()) {
if (creatingFile) {
Files.createFile(zipLocation);
}else {
return false;
}
} else if (zipLocation.toFile().exists() && !replacing) {
return false;
}
final FileSystem fs = FileSystems.newFileSystem(zipLocation, null);
.
.
.
zipLocation
是一条路径creatingFile
是一个布尔
答案:在我的特殊情况下,由于路径中的空格,给出的答案不合适,因此我不得不按照我不想的方式进行:
Files.createFile(zipLocation);
ZipOutputStream out = new ZipOutputStream(
new FileOutputStream(zipLocation.toFile()));
out.putNextEntry(new ZipEntry(""));
out.closeEntry();
out.close();
这并不意味着给出的答案是错误的,它只是不适用于我的特定情况
如Oracle网站:中所述
public static void createZip(Path zipLocation, Path toBeAdded, String internalPath) throws Throwable {
Map<String, String> env = new HashMap<String, String>();
// check if file exists
env.put("create", String.valueOf(Files.notExists(zipLocation)));
// use a Zip filesystem URI
URI fileUri = zipLocation.toUri(); // here
URI zipUri = new URI("jar:" + fileUri.getScheme(), fileUri.getPath(), null);
System.out.println(zipUri);
// URI uri = URI.create("jar:file:"+zipLocation); // here creates the
// zip
// try with resource
try (FileSystem zipfs = FileSystems.newFileSystem(zipUri, env)) {
// Create internal path in the zipfs
Path internalTargetPath = zipfs.getPath(internalPath);
// Create parent directory
Files.createDirectories(internalTargetPath.getParent());
// copy a file into the zip file
Files.copy(toBeAdded, internalTargetPath, StandardCopyOption.REPLACE_EXISTING);
}
}
public static void main(String[] args) throws Throwable {
Path zipLocation = FileSystems.getDefault().getPath("a.zip").toAbsolutePath();
Path toBeAdded = FileSystems.getDefault().getPath("a.txt").toAbsolutePath();
createZip(zipLocation, toBeAdded, "aa/aa.txt");
}