解压缩并重新压缩文件而不写入磁盘-Java

解压缩并重新压缩文件而不写入磁盘-Java,java,zip,unzip,zipoutputstream,Java,Zip,Unzip,Zipoutputstream,我正试图用Java编写一个程序来解压和重新压缩文件,而不必写入磁盘。到目前为止, public void unzipFile(String filePath) { FileInputStream fis = null; ZipInputStream zipIs = null; ZipEntry zEntry = null; try { fis = new FileInputStream(filePath); zipIs = new

我正试图用Java编写一个程序来解压和重新压缩文件,而不必写入磁盘。到目前为止,

public void unzipFile(String filePath) {

    FileInputStream fis = null;
    ZipInputStream zipIs = null;
    ZipEntry zEntry = null;
    try {
        fis = new FileInputStream(filePath);
        zipIs = new ZipInputStream(new BufferedInputStream(fis));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(baos);
        while ((zEntry = zipIs.getNextEntry()) != null) {
              zos.putNewEntry(zEntry);
              zos.write(...);
              zos.close();
}
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

我的问题是我不知道如何将ZipEntry写入ZipOutputStream。我收到错误,“java.util.zip.ZipException:invalid entry size(预期125673,但得到0字节)”。有人能给我指出正确的方向吗?

您只需要将数据从
ZipInputStream
复制到
zipouttstream
中,在那里有
zos.write(…)
语句。下面,我已将副本隔离到名为
copyStream()
的助手方法,但如果需要,可以将其内联

另外,不要关闭循环内的流。为了更好地管理资源,我还将代码改为使用try with resources,这样您就不会再看到任何
close()
调用

下面是一个运行示例:

public static void main(String[] args) throws Exception {
    String filePath = System.getProperty("java.home") + "/lib/rt.jar";
    rezipFile(filePath);
}
public static void rezipFile(String filePath) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (
        ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(filePath)));
        ZipOutputStream zos = new ZipOutputStream(baos);
    ) {
        for (ZipEntry zEntry; (zEntry = zis.getNextEntry()) != null; ) {
            zos.putNextEntry(zEntry);
            copyStream(zis, zos);
        }
    }
    System.out.println(baos.size() + " bytes copied");
}
private static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buf = new byte[4096];
    for (int len; (len = in.read(buf)) > 0; )
        out.write(buf, 0, len);
}
我的机器上的输出:

63275847字节已复制

首先,不要在循环内调用
close()
。您如何调用此方法?
“首先,不要在循环内调用close()。
——认真地说