6
我想壓縮目錄內容到zip檔案使用java。 一切都很好,但我只是想澄清一些事實。 下面是我用它來壓縮文件中的代碼:壓縮的zip檔案
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();
}
}
}
現在有問題:
它是正確的,在默認情況下(在我的情況也是如此),我會得到已經被壓縮檔案(使用Deflate方法)?
如何獲得無壓縮歸檔:
- 如果我設置方法
zipOutputStream.setMethod(ZipOutputStream.STORED)
我必須提供大小,壓縮後的大小(是這將是等於大小?)和CRC,否則我會得到異常 - 如果我不想自己計算大小和crc,我可以使用
DEFLATE
零級別的方法:
因此,在這種情況下,我是否沒有壓縮存檔?zipOutputStream.setMethod(ZipOutputStream.DEFLATED); zipOutputStream.setLevel(ZipOutputStream.STORED);
- 是否有更方便明顯的創建未壓縮存檔的方法?
- 如果我設置方法
This [answer](http://stackoverflow.com/a/1207041/354831)可能會幫助你STORED。 – 2013-03-13 08:21:04
根據您的使用情況,您也可以考慮'.tar'格式,而不是'.zip',用於未壓縮的歸檔。其中一個lib:https://code.google.com/p/jtar/ – hyde 2013-03-13 08:45:05