通过Java复制Zip文件的最佳方法

bas*_*neu 4 java zip

经过一番研究:

如何创建Zip文件

和一些谷歌研究我想出了这个java函数:

 static void copyFile(File zipFile, File newFile) throws IOException {
    ZipFile zipSrc = new ZipFile(zipFile);
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(newFile));

    Enumeration srcEntries = zipSrc.entries();
    while (srcEntries.hasMoreElements()) {
            ZipEntry entry = (ZipEntry) srcEntries.nextElement();
            ZipEntry newEntry = new ZipEntry(entry.getName());
            zos.putNextEntry(newEntry);

            BufferedInputStream bis = new BufferedInputStream(zipSrc
                            .getInputStream(entry));

            while (bis.available() > 0) {
                    zos.write(bis.read());
            }
            zos.closeEntry();

            bis.close();
    }
    zos.finish();
    zos.close();
    zipSrc.close();
 }
Run Code Online (Sandbox Code Playgroud)

这段代码正在运行......但它并不好看和干净......任何人都有一个好主意或一个例子?

编辑:

我想能够添加一些类型的验证,如果zip存档得到正确的结构...所以复制它像普通文件而不考虑其内容对我不起作用...或者你更喜欢之后检查...我不确定这个

For*_*ega 10

你只想复制完整的zip文件?打开并阅读zip文件不需要...只需复制它就像复制其他文件一样.

public final static int BUF_SIZE = 1024; //can be much bigger, see comment below


public static void copyFile(File in, File out) throws Exception {
  FileInputStream fis  = new FileInputStream(in);
  FileOutputStream fos = new FileOutputStream(out);
  try {
    byte[] buf = new byte[BUF_SIZE];
    int i = 0;
    while ((i = fis.read(buf)) != -1) {
        fos.write(buf, 0, i);
    }
  } 
  catch (Exception e) {
    throw e;
  }
  finally {
    if (fis != null) fis.close();
    if (fos != null) fos.close();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 关于你的代码的一些评论(没有downvote):( 1)如果你只是要重新抛出异常,就不需要一个catch块; try/finally有效.(2)你应该在try中创建两个流,否则你可以在创建`fos`时抛出并让`fis`保持打开状态.(3)如果`close()`操作抛出,异常将掩盖从try抛出的任何异常(可能是更高的值).(4)通过使用`throws Exception`,你丢弃了有价值的API文档; 你得到的唯一检查异常是`IOException`,所以这应该是你声明的. (3认同)
  • 不要犹豫,使用10K甚至100K的缓冲区。内存保存时间不长,对于大文件确实有所作为。 (2认同)