从jar中高效提取文件

时间:2009-06-20 18:25:46

标签: java jar copy extract

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

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

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

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

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

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

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

对于新的,更快的代码,请参阅接受的回复。

3 个答案:

答案 0 :(得分:7)

您是否可以控制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文件相比如何?

答案 1 :(得分:1)

ERR。我不确定你真的想做什么 - 但你想过使用winzip吗?

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

当然你可以提取一次然后用应用程序分发它们吗?

答案 2 :(得分:0)

我同意乔恩。 2件事会使提取更快:

  1. 降低压缩级别。
  2. 增加复制/解压缩时使用的缓冲区大小。
  3. 我认为需要提取是由于需要从文件写入/重新读取。如果文件足够小,则内存足够大,并且文件的持久性不是必需的;您可以考虑将整个资源映射到内存,而不是将磁盘用作存储。