4

I'm currently writing a function what would create a zip file, which will be used in other functionality. Below it is my function's code:

public void createZip(){

        try{
            String outfile = this.filename + ".zip";
            //input file
            FileInputStream input = new FileInputStream(this.filename);
            //output file
            ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(outfile));
            //name the file inside the zip file
            System.out.println(this.filename);
            zip.putNextEntry(new ZipEntry(this.filename));

            byte[] buffer = new byte[this.BUFFER];
            int len;
            //copy the file to the zip
            while((len= input.read(buffer)) > 0){
                System.out.println(len);
                zip.write(buffer, 0, len);
            }
            zip.closeEntry();
            zip.flush();
            input.close();
            zip.close();
            this.filename += ".zip";
        }
        catch(IOException e){
            e.printStackTrace();
        }

    }

I have tried to debug, but I couldn't find the source of this problem. The function runs without any further problems, but the zip file produced it is an empty one.

4

6 に答える 6

9

出力ストリームを閉じる前に、 ZipOutputStream#closeEntry()を使用してエントリを閉じる必要があります。そうしないと、エントリが完全に書き込まれたことが確認されません。

また、ZipEntryの名前をパス全体にすることはできません。つまり、dog.pngの代わりになりC:\Users\Admin\Documents\dog.pngます。この問題は例外なく通過し、ファイルのデータが圧縮ファイルとしてzipに圧縮されるのではなく、zipに直接圧縮される原因になります。

于 2012-06-13T20:36:02.547 に答える
3
final static byte[] EmptyZip={80,75,05,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00};
public static void createEmptyZip(String path){
    try{
        FileOutputStream fos=new FileOutputStream(new File(path));
        fos.write(EmptyZip, 0, 22);
        fos.flush();
        fos.close();
    }catch (FileNotFoundException e){
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
于 2013-10-03T07:40:33.813 に答える
2

コード内でファイル名を使用しないのに、なぜファイル名をパラメーターとして渡すのか疑問に思っています。常にthis.filenameを使用しているためです。これにより、オブジェクトの状態に設定した名前でzipファイルに名前を付けようとしていると思います。また、ZipEntryでも同じ名前を使用しているため、同じジッパーファイルをその中に追加しようとしています。ZipEntryは既存のファイルを指すと、空になります。

それが役に立てば幸い。

于 2012-06-13T20:37:02.170 に答える
0

closeはバッファをフラッシュするはずですが、閉じる前にzip.flush()を使用してバッファをフラッシュしてみてください。

this.filenameも確認してください。同じ名前のローカル変数があります。ローカル変数filenameは使用されません。zipファイルが予想とは異なる場所に書き込まれている可能性があります。

于 2012-06-13T20:30:53.617 に答える
0

@phillipeこれを試してください

    public void createZip(String filename) {
    try {
        //input file
        FileInputStream input = new FileInputStream(filename);
        //output file
        ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(filename + ".zip"));
        //name the file inside the zip file
        zip.putNextEntry(new ZipEntry(filename));

        byte[] buffer = new byte[1024];
        int len;
        //copy the file to the zip
        while((len = input.read(buffer)) > 0) {
            System.out.println();
            zip.write(buffer, 0 , len);
        }
        zip.closeEntry();
        zip.flush();
        zip.close();
        input.close();
        filename += ".zip";
    } catch(IOException e) {
        e.printStackTrace();
    }
}

それらのコードはzipファイルを作成し、それは私にとってもうまくいきます。:)

于 2012-06-13T21:18:11.503 に答える
0

シンプルなソリューション。ZipEntryファイルセパレータなしで1つの手動ディレクトリを作成します。

zip.putNextEntry(new ZipEntry("LOG" + fileName));

それ以外の

zip.putNextEntry(new ZipEntry(fileName));

ここfileName = file.getAbsoluteFile();

これにより、最初にzipファイルにLOG dirが作成され、次にディレクトリパスを持つfileNamesが作成されます。これにより、zipファイルに最初の空のディレクトリが作成されなくなります。

于 2013-03-12T11:20:38.343 に答える