如何在java中创建一个Gzip存档,来自字符串?

时间:2013-04-26 19:12:34

标签: java compression zip gzip

我有3个字符串,每个字符串代表一个txt文件内容,不是从计算机加载的,而是由Java生成的。

String firstFileCon = "firstContent"; //File in .gz: 1.txt
String secondFileCon = "secondContent"; //File in .gz: 2.txt
String thirdFileCon = "thirdContent"; //File in .gz: 3.txt

如何创建包含三个文件的GZIP文件,并将压缩文件保存到光盘?

3 个答案:

答案 0 :(得分:2)

创建名为 output.zip 的zip文件,其中包含文件 1.txt 2.txt 3 .txt 及其内容字符串,请尝试以下操作:

Map<String, String> entries = new HashMap<String, String>();
entries.put("firstContent", "1.txt");
entries.put("secondContent", "2.txt");
entries.put("thirdContent", "3.txt");

FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
    fos = new FileOutputStream("output.zip");

    zos = new ZipOutputStream(fos);

    for (Map.Entry<String, String> mapEntry : entries.entrySet()) {
        ZipEntry entry = new ZipEntry(mapEntry.getValue()); // create a new zip file entry with name, e.g. "1.txt"
        entry.setMethod(ZipEntry.DEFLATED); // set the compression method
        zos.putNextEntry(entry); // add the ZipEntry to the ZipOutputStream
        zos.write(mapEntry.getKey().getBytes()); // write the ZipEntry content
    }
} catch (FileNotFoundException e) {
    // do something
} catch (IOException e) {
    // do something
} finally {
    if (zos != null) {
        zos.close();
    }
}

有关详细信息,请参阅Creating ZIP and JAR files,尤其是压缩文件一章。

答案 1 :(得分:0)

一般来说,GZIP仅用于压缩单个文件(因此java.util.zip.GZIPOutputStream只支持单个条目)。

对于多个文件,我建议使用为多个文件设计的格式(如zip)。 java.util.zip.ZipOutputStream就是这样。如果由于某种原因,您确实希望最终结果为GZIP,则可以始终创建一个ZIP文件,其中包含您的所有3个文件,然后是GZIP文件。

答案 2 :(得分:0)

目前还不清楚您是否只想存储文本或实际的单个文件。我不认为你可以在没有第一次TARing的情况下在GZIP中存储多个文件。这是一个将字符串存储到GZIP的示例。也许它会帮助你:

public static void main(String[] args) {
    GZIPOutputStream gos = null;

    try {
        String str = "some string here...";
        File myGzipFile = new File("myFile.gzip");

        InputStream is = new ByteArrayInputStream(str.getBytes());
        gos = new GZIPOutputStream(new FileOutputStream(myGzipFile));

        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            gos.write(buffer, 0, len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try { gos.close(); } catch (IOException e) { }
    }
}