Java 压缩压缩压缩压缩文件
我正在尝试使用java将目录内容压缩到zip存档中。 一切都很好,但我只想澄清一些事实。 下面是我用来压缩文件的代码:Java 压缩压缩压缩压缩文件,java,zip,deflate,Java,Zip,Deflate,我正在尝试使用java将目录内容压缩到zip存档中。 一切都很好,但我只想澄清一些事实。 下面是我用来压缩文件的代码: public void pack(@Nonnull String archiveName, @Nonnull File outputDir, @Nonnull File targetDir) { File zipFile = new File(outputDir, "out.zip"); ZipOutputStream zipOutputStream = null;
public void pack(@Nonnull String archiveName, @Nonnull File outputDir, @Nonnull File targetDir) {
File zipFile = new File(outputDir, "out.zip");
ZipOutputStream zipOutputStream = null;
OutputStream outputStream;
try {
// create stream for writing zip archive
outputStream = new FileOutputStream(zipFile);
zipOutputStream = new ZipOutputStream(outputStream);
// write files recursively
writeFiles(zipOutputStream, targetDir.listFiles(), "");
} catch (IOException e) {
LOGGER.error("IO exception while packing files to archive", e);
} finally {
// close output streams
if (zipOutputStream != null) {
try {
zipOutputStream.close();
} catch (IOException e) {
LOGGER.error("Unable to close zip output stream", e);
}
}
}
}
/**
* Writes specified files and their children (in case of directories) to archive
*
* @param zipOutputStream archive output stream
* @param files which should be added to archive
* @param path path relative of root of archive where files should be placed
*/
private void writeFiles(@Nonnull ZipOutputStream zipOutputStream, @Nullable File[] files, @Nonnull String path) throws IOException {
if (files == null || files.length == 0) {
return;
}
for (File file : files) {
if (file.isDirectory()) {
// recursively add files in this directory
String fullDirectoryName = path + file.getName() + "/";
File[] childFiles = file.listFiles();
if (childFiles != null && childFiles.length > 0) {
// write child files to archive. current directory will be created automatically
writeFiles(zipOutputStream, childFiles, fullDirectoryName);
} else {
// empty directory. write directory itself to archive
ZipEntry entry = new ZipEntry(fullDirectoryName);
zipOutputStream.putNextEntry(entry);
zipOutputStream.closeEntry();
}
} else {
// put file in archive
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
zipOutputStream.putNextEntry(new ZipEntry(path + file.getName()));
ByteStreams.copy(bufferedInputStream, zipOutputStream);
zipOutputStream.closeEntry();
bufferedInputStream.close();
}
}
}
现在有一些问题:
- 如果我设置method
我必须提供大小、压缩大小(是否等于大小?)和crc,否则我将得到异常zipoutptstream.setMethod(zipoutstream.STORED)
- 如果我不想自己计算大小和crc,我可以使用零级的
方法:DEFLATE
所以,在这种情况下,我得到的不是压缩的归档文件,这是正确的吗zipOutputStream.setMethod(ZipOutputStream.DEFLATED); zipOutputStream.setLevel(ZipOutputStream.STORED);
- 有没有更方便、更明显的方法来创建非压缩档案
不是重新发明轮子,我会认真考虑使用现有的库,比如Apache Ant。创建zip文件的基本习惯用法是:
Project p = new Project();
p.init();
Zip zip = new Zip();
zip.setProject(p);
zip.setDestFile(new File(outputDir, "out.zip"));
FileSet fs = new FileSet();
fs.setProject(p);
fs.setDirectory(targetDir);
zip.addFileset(fs);
zip.perform();
默认情况下,您将获得一个压缩的归档文件。对于未压缩的zip,您需要添加的是
zip.setCompress(false);
<> > <>代码> StestDestFiels/Cuff>(实际上在<代码>之前的任何地方执行< /代码>).< /P>这可能对存储有帮助。您也可以考虑“代码> > TAUT/CODE格式,而不是<代码> .zip ,根据您的使用情况,对未压缩的存档文件进行压缩。一个lib: