从多个zip文件中读取数据并将它们合并为一个

时间:2014-12-05 17:50:42

标签: java file zip inputstream fileoutputstream

我想从4个zip文件中读取数据,称为zip1,zip2,zip3,zip4。所有这些zip文件都从这个名为" BigZip"的大型zip文件中分离出来。我想将zip文件合并为一个,然后比较字节,如果1 bigzip文件与字节大小匹配(zip1 + zip2 + zip3 + zip4)的组合zip文件。当我合并4个zip文件的大小时,我得到一个非常小的文件大小。我做错了什么?

以下是我的相同代码:

targetFilePath1,targetFilePath2,targetFilePath3,targetFilePath4属于4个zip文件的路径。 sourceFilePath是BigZip文件的路径

class Test {


public static void main(String args[]) {

ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(sourceBigZip));

            readZip(sourceFilePath, targetFilePath1);
            readZip(sourceFilePath, targetFilePath2);
            readZip(sourceFilePath, targetFilePath3);
            readZip(sourceFilePath, targetFilePath4);
  outStream.close();
}

static void readZip(String sourceBigZip, String targetFile) throws Exception {
    ZipInputStream inStream = new ZipInputStream(new FileInputStream(targetFile));
    byte[] buffer = new byte[1024];
    int len = inStream.read(buffer);
    while (len != -1) {
        outStream.write(buffer, 0, len);
        len = inStream.read(buffer);
        System.out.print(len);
    }

    inStream.close();
}
}

2 个答案:

答案 0 :(得分:3)

创建ZipOutputStream一次并将其传递给readZip()方法,例如:

public static void main(String args[]) {
    ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(sourceFilePath));
    readZip(outStream , targetFilePath1);
    readZip(outStream , targetFilePath2);
    readZip(outStream , targetFilePath3);
    readZip(outStream , targetFilePath4);
}

然后你有一个错误处理将数据从一个zip复制到另一个... 您需要复制zip文件中的每个文件,如下所示:

static void readZip(ZipOutputStream outStream, String targetFile)
        throws Exception {
    ZipInputStream inStream = new ZipInputStream(new FileInputStream(
            targetFile));
    byte[] buffer = new byte[1024];
    int len = 0;

    for (ZipEntry e; (e = inStream.getNextEntry()) != null;) {
        outStream.putNextEntry(e);
        while ((len = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, len);
        }
    }
    inStream.close();
}

}

答案 1 :(得分:-1)

每次调用new ZipOutputStream时,它都会创建一个新的空文件,并清除之前写入的所有内容。 您必须在readZip之外创建流,并将其传递给每个调用,而不是每次都创建新流。