【问题标题】:Efficient extraction of file from jar从jar中高效提取文件
【发布时间】:2009-06-20 18:25:46
【问题描述】:

我有一个用 Java 编写的应用程序,它使用一个 jar 文件(它使用多个,但这不是重点)。

事实上,我使用的 Jar 文件包含我绝对必须提取到文件系统的文件。

到目前为止,我使用的是 Class.getResourceAsStream 和 FileOutputStream,但是这种方法有点慢。 请注意,其中一些文件是基于文本的,但其他文件只是二进制文件。

因此,除了尝试减少从 JAR 中提取文件的需要之外,是否有针对这些任务的任何优化(例如更充分的功能)。

请注意,我的应用程序是基于 Java 6 的,我希望将外部依赖降至最低。

编辑:为了将来参考,我的 OLD(无效)代码是:

int c;
while((c = is.read())!=-1){
    fos.write(c);
}

有关速度更快的新代码,请参阅已接受的回复。

【问题讨论】:

    标签: java jar copy extract


    【解决方案1】:

    您可以控制 jar 文件吗?如果您在未压缩的情况下创建它,可能会使其更快。显然它会使 jar 文件变大...

    另一件要检查的事情 - 你是如何提取文件的?例如,如果你一个字节一个字节地做,它会非常慢。使用这样的东西:

    public static void copyStream(InputStream input, OutputStream output)
         throws IOException
    {
        // Reads up to 8K at a time. Try varying this.
        byte[] buffer = new byte[8192];
        int read;
    
        while ((read = input.read(buffer)) != -1)
        {
            output.write(buffer, 0, read);
        }
    }
    

    如果您已经这样做了,您能给我们提供更多信息吗? “有点慢”有多慢?与使用 jar 实用程序提取 jar 文件相比如何?

    【讨论】:

    • 我真的是一个字节一个字节地复制!现在速度快得多了!谢谢!
    【解决方案2】:

    错了。我不确定您真正想要做什么 - 但您是否考虑过使用 winzip?

    显然,如果您需要在运行时动态提取文件,这将不起作用 - 但我不确定您为什么需要这样做 - 这个 jar 文件多久更改一次?

    您当然可以提取它们一次,然后将它们与应用程序一起分发?

    【讨论】:

      【解决方案3】:

      我同意乔恩的观点。两件事会使提取更快:

      1. 降低压缩级别。
      2. 增加复制/提取时使用的缓冲区大小。

      我认为需要提取是由于需要从文件中写入/重新读取。如果文件足够小,内存就足够大,并且文件的持久性不是必需的;您可以考虑将整个资源映射到内存,而不是使用磁盘作为存储。

      【讨论】:

      • 文件大约165KB。 jar 与 NetBeans 输出的一样被压缩。
      猜你喜欢
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2011-07-03
      相关资源
      最近更新 更多