14

Java 7 が提供するを使用して (既存の) zip ファイルの内容を正常に変更しましたFileSystemが、この方法で新しい zip ファイルを作成しようとすると失敗し、次のようなエラー メッセージが表示されます"zip END header not found"。私がやっている方法では、最初にFiles.createFile完全に空のファイルであるファイル ( ) を作成し、次にそのファイル システムにアクセスしようとしましたが、ファイルが空であるため、zip 内のヘッダーを見つけることができません。質問は、この方法を使用して完全に空の新しい zip ファイルを作成する方法はありますか?; 私が検討したハックは、空の新しいものを追加することですZipEntryzipファイルに変換し、その新しい空のファイルを使用してそれに基づいてファイルシステムを作成しましたが、オラクルの人たちが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();

与えられた答えが間違っているという意味ではありません。私の特定のケースではうまくいきませんでした

4

1 に答える 1

23

The Oracle Siteで説明されているように:

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");
}
于 2013-02-06T16:23:52.620 に答える