我有100.000多个文件,其中几乎4GB。它的html所以它可以压缩70-80%。文件范围从200 KB到将近10 MB。
我正在开发一个应用程序,将文件从xml转换为html。最后,应用程序将将html目录存档到zip文件中。
我使用了一个叫做“复制- maven - plugin”的maven插件。这个插件的文档非常好,而且很容易使用。默认情况下,插件使用的存档功能是"ant“,但您可以将其更改为使用TrueZip。为了解开它的陨石。不管怎样,我试着用两种方式打包我的怪物文件夹。默认的Ant使用43分钟,TrueZip使用38分钟。在我看来,这两种方式都有很大帮助。
然后,我在命令行中使用"zip -r归档文件夹“尝试了同样的操作,这只花了4分钟。编辑:最近还没能压缩到40分钟以下。我想也许这4分钟的时间可能会以一个腐败的拉链收场。
所以我在想,当涉及到处理这么多文件时,java可能不是那么好。
有没有人知道这类问题,或有任何经验?
我正在考虑也许实现我自己的东西,通过改变字节读取大小它会有帮助吗?我知道您可以通过使用ZipInputStream/ZipOutputStream与Zip4j一起创建/解压缩zip文件并使用您自己的缓冲区大小来限制读取的数据块,但我没有尝试过。当我花了很长时间才知道的时候,我就不能一直等下去了;-)
截至昨晚,maven在zipIt.sh (zip -r .)上调用exec。在合理的时间内完成这项工作,但我想给java以怀疑的好处。
更新1 I有不同的测试方法(所有默认压缩级别):
tar+bz2和tar+gz似乎都是很好的替代品,给了我一些选择--压缩还是速度是最重要的。
我没有Testetjdk7.0 ZipOutputStream,但看起来我可能已经解决了它。我使用了一个64 it (64*1024)的读缓冲区,它似乎很有魅力。看来我毕竟是用java来淘金的:)
这是我的实现
public static void main(String [] args) {
String outputFile = Config.getProperty(Property.ZIP_FILE);
String folderToAdd = Config.getProperty(Property.HTML_FOLDER);
Zipper.zip(outputFile, folderToAdd, 64*1024);
}
private static void zip(String zipFile, String sourceDirectory, int readChunk) {
ZipOutputStream out = null;
try {
//create byte buffer
byte[] buffer = new byte[readChunk];
File dirObj = new File(sourceDirectory);
out = new ZipOutputStream(new FileOutputStream(zipFile));
logger.info("Creating zip {} with read buffer '{}'", zipFile, readChunk);
addDir(dirObj, out, buffer);
} catch (IOException ioe) {
logger.error("IOException :" + ioe);
} finally {
IOUtils.closeQuietly(out);
}
}
private static void addDir(File dirObj, ZipOutputStream out, byte [] readChunk) throws IOException {
logger.debug("Zipping folder '{}'", dirObj.getName());
StopWatch watch = new StopWatch();
watch.start();
File[] files = dirObj.listFiles();
for (File file : files != null ? files : new File[0]) {
if (file.isDirectory()) {
addDir(file, out, readChunk);
continue;
}
FileInputStream in = null;
try {
in = new FileInputStream(file.getAbsolutePath());
out.putNextEntry(new ZipEntry(file.getAbsolutePath()));
int len;
while ((len = in.read(readChunk)) > 0) {
out.write(readChunk, 0, len);
}
} finally {
out.closeEntry();
IOUtils.closeQuietly(in);
}
}
watch.stop();
logger.debug("Zipped folder {} in {} seconds.", dirObj.getName(), watch);
}发布于 2013-11-04 08:09:46
我怀疑问题在于文件的数量。您需要能够操作ZIP条目,而无需对所有条目进行解压缩和重新打包。这可能会产生很大的不同。我预计会有10倍的差额。这可以用Java实现,但我怀疑大多数库都不是为此设计的。
您可以做的是从Java调用zip,如果这看起来像您想要的那样。使用命令行工具的许多maven插件(尤指用于版本控制的)
顺便说一句,使用tar + bz2之类的东西可以得到更好的压缩。这压缩的更多是通过压缩整个存档,而不是单独压缩每个文件。这将意味着你不能触摸它,除非解除压缩/压制整件事。(与您可能这样做的JAR/ZIP不同)
https://stackoverflow.com/questions/19763533
复制相似问题