0

このzipファイルをJava/Groovyで作成する方法をいくつか試しました。私が試みた最初のいくつかの方法は、さまざまなブログ/投稿から、開くことができなかった破損したzipファイルをもたらしました。それで、私はかなり有望に見えたこれ(下)を試しました。sysoutsは、FileInputStreamに渡されている有効なファイルパスを報告します。問題の原因がZipOutputStreamに渡されているFQパスであるかどうかはわかりません。いずれにせよ、以下はコードであり、その結果、小さな(188kb)zipファイル(エントリなし)が作成されます。助言がありますか?

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

class FileZipper {

    public static void makeZip(Set fullyQualifiedFileNames, String zipFileName, String outDir) throws IOException, FileNotFoundException
    {
        // These are the files to include in the ZIP file
        Object[] filenames = fullyQualifiedFileNames.toArray();
        String fileSeparator =  (String) System.getProperties().get("file.separator");

        // Create a buffer for reading the files
        byte[] buf = new byte[1024];

        // Create the ZIP file
        String outFilename = outDir + fileSeparator +zipFileName;
        FileOutputStream fos = new FileOutputStream(outFilename);
        ZipOutputStream zos = new ZipOutputStream(fos);
        System.out.println("Zipping to file " +outFilename);
        // Compress the files

        for (Object fileName: filenames)
        {
            System.out.println("Adding file: " + fileName);
            FileInputStream fis = new FileInputStream((String)fileName);

            // Add ZIP entry to output stream.
            String[] nodes = ((String)fileName).split("[/[\\\\]]");
            String zipEntry = nodes[nodes.length-1];
            System.out.println("Adding Zip Entry: " + zipEntry);
            zos.putNextEntry(new ZipEntry((String)fileName));

            // Transfer bytes from the file to the ZIP file
            int len;
            int totalBytes = 0;
            while ((len = fis.read(buf)) > 0) 
            {
                totalBytes += len;
                zos.write(buf, 0, len);
            }
            System.out.println("Zipped " +totalBytes +" bytes");
            // Complete the entry
            zos.closeEntry();
            fis.close();
        }

        // Complete the ZIP file
        zos.close();
        fos.close();
    }
}
4

3 に答える 3

8

Groovyを使用している場合、最も簡単な方法は次を使用することAntBuilderです。

new AntBuilder().zip(
   destfile: "myfile.zip",
   basedir: "baseDir")

またはGroovy1.8以降:

ant.zip(destfile: 'file.zip', basedir: 'src_dir')
于 2012-07-13T19:19:34.630 に答える
1

すべてのデータがディスクにフラッシュされたことを確認するために、基になるFileOutputStreamを明示的に閉じようとしましたか?

FileOutputStream fos = new FileOutputStream(outFilename);
ZipOutputStream zos = new ZipOutputStream(fos);
...
zos.Close();
fos.Close();
于 2012-07-13T19:10:57.723 に答える
0

コードをローカルで実行しましたが、zipファイルを作成して開くのに問題はありませんでした。

ただし、デフォルトのJava圧縮ユーティリティで奇妙な問題が発生することがあったため、Apache Commons圧縮を使い始めてから、ほとんど問題なく使用しています。

基本的な概要についてはhttp://commons.apache.org/compress/index.htmlを確認し、具体的な例についてはhttp://commons.apache.org/compress/examples.htmlを確認してください。

于 2012-07-13T19:26:44.957 に答える