Java 从多个zip文件中读取数据并将其合并为一个
我想从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文件的路径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
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
。