簡體   English   中英

Java:zip中的zip變得不可讀

[英]Java: A zip in a zip becomes unreadable

對於項目,我需要創建一個包含兩個zip文件的zip文件。 我創建了一些方法來執行此操作,但是,生成的zip文件不正確。

考慮以下測試類:

package nl.test;

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.junit.Test;

public class ZipTest {

    @Test
    public void test() throws IOException {
        Path p = Paths.get("input.txt");
        try (BufferedWriter writer = Files.newBufferedWriter(p)) {
            writer.write("text to compress");
        }
        Path p1 = createZipFile("p.zip", p);
        createZipFile("p1.zip", p1);
    }

    private Path createZipFile(String zipName, Path p) {
        try {
            OutputStream fos = Files.newOutputStream(Paths.get(zipName));
            ZipOutputStream zos = new ZipOutputStream(fos);
            OutputStream bos = new BufferedOutputStream(zos);
            try (Writer writer = new OutputStreamWriter(bos)) {
                zos.putNextEntry(new ZipEntry(p.toString()));
                writer.write(new String(Files.readAllBytes(p)));
                writer.flush();
            }
            return Paths.get(zipName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

執行此操作時,文件p1.zip確實包含一個p.zip,但是該p.zip不可讀。 有沒有辦法解決這個問題? 還是有其他方法可以將拉鏈放在拉鏈中?

這是一種更簡單的方法:

  1. 右鍵單擊要添加到“ p.zip”的文件
  2. 單擊添加以存檔並編輯設置(如果要)
  3. 右鍵單擊存在p.zip的文件夾中的任何位置,然后將鼠標懸停在新建的位置,然后選擇“壓縮的壓縮文件夾”
  4. 創建后,只需將p.zip拖到剛才創建的壓縮文件夾中即可。
  5. 瞧!

直到我弄清為什么它不起作用,才使用zip4j解決:

package nl.test;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.junit.Test;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

public class ZipTest2 {

    @Test
    public void test() throws IOException {
        Path p = Paths.get("input.txt");
        try (BufferedWriter writer = Files.newBufferedWriter(p)) {
            writer.write("text to compress");
        }
        Path p1 = createZipFile("p1.zip", p);
        createZipFile("p2.zip", p1);
    }

    private Path createZipFile(String compressedFile, Path inputPath) {
        try {
            ZipFile zipFile = new ZipFile(compressedFile);
            ZipParameters parameters = new ZipParameters();

            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_FASTEST);
            zipFile.addFile(inputPath.toFile(), parameters);

            return Paths.get(compressedFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

將生成的zip添加到另一個zip時可以使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM