首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于大量文件的Java库

用于大量文件的Java库
EN

Stack Overflow用户
提问于 2013-11-04 07:46:05
回答 1查看 2.2K关注 0票数 1

我有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有不同的测试方法(所有默认压缩级别):

  1. 来自java的zip4j。只花了3分钟。但文件被破坏了。似乎zip4j不处理这个数量的文件。
  2. Ant (通过maven插件)。压缩:大约980。慢速:大约40分钟
  3. 命令行中的tar + xz。压缩:567。速度差: 63分钟。
  4. 从命令行拉上来。压缩:981。速度: 40分钟
  5. 命令行中的tar + bz2。压缩: 602MB。速度: 13分钟
  6. 命令行的tar + gz。压缩:864。速度:5分钟
  7. java.util.zip.ZipOutputStream。压缩:986。速度:燃烧4分18秒

tar+bz2和tar+gz似乎都是很好的替代品,给了我一些选择--压缩还是速度是最重要的。

我没有Testetjdk7.0 ZipOutputStream,但看起来我可能已经解决了它。我使用了一个64 it (64*1024)的读缓冲区,它似乎很有魅力。看来我毕竟是用java来淘金的:)

这是我的实现

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-04 08:09:46

我怀疑问题在于文件的数量。您需要能够操作ZIP条目,而无需对所有条目进行解压缩和重新打包。这可能会产生很大的不同。我预计会有10倍的差额。这可以用Java实现,但我怀疑大多数库都不是为此设计的。

您可以做的是从Java调用zip,如果这看起来像您想要的那样。使用命令行工具的许多maven插件(尤指用于版本控制的)

顺便说一句,使用tar + bz2之类的东西可以得到更好的压缩。这压缩的更多是通过压缩整个存档,而不是单独压缩每个文件。这将意味着你不能触摸它,除非解除压缩/压制整件事。(与您可能这样做的JAR/ZIP不同)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19763533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档