Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从多个zip文件中读取数据并将其合并为一个_Java_File_Zip_Inputstream_Fileoutputstream - Fatal编程技术网

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

Java 从多个zip文件中读取数据并将其合并为一个,java,file,zip,inputstream,fileoutputstream,Java,File,Zip,Inputstream,Fileoutputstream,我想从4个zip文件中读取数据,这些文件名为zip1、zip2、zip3、zip4。所有这些zip文件都是从一个名为“BigZip”的大zip文件中分离出来的。我想将zip文件合并成一个,然后比较1 bigzip文件与组合zip文件(zip1+zip2+zip3+zip4)的字节大小是否匹配。当我将4个zip文件的大小合并在一起时,我得到了一个非常小的文件大小。我做错了什么 以下是我的代码: targetFilePath1、targetFilePath2、targetFilePath3、targ

我想从4个zip文件中读取数据,这些文件名为zip1、zip2、zip3、zip4。所有这些zip文件都是从一个名为“BigZip”的大zip文件中分离出来的。我想将zip文件合并成一个,然后比较1 bigzip文件与组合zip文件(zip1+zip2+zip3+zip4)的字节大小是否匹配。当我将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();
}
}

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

创建一次
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时出现错误。。。 您需要复制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();
}

}

你是说像我现在编辑的代码?请检查我的编辑?几乎。。。除了,
readZip
中未定义
outStream
。您必须将其作为参数传入,而不是
sourceBigZip
,后者现在未使用。此外,您的参数命名似乎相当混乱:源应该是您读取的位置,目标应该是您写入的位置,不是吗?请注意,zip是一个结构化的归档文件,您不能简单地将其作为流进行读取和写入。签出
ZipInputStream
ZipOutStream
的文档。存档由条目组成,因此,在读取流之前,必须将其定位在实际条目处(使用
stream.getNextEntry()
)。同一个归档文件中可以有多个条目,并且在每个条目的末尾返回eof(-1)。这就是您的示例中发生的情况,因为您没有正确定位,所以您立即得到-1并退出。写入输出时,在开始写入之前还需要执行
.putNewEntry