1

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

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

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

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

请注意,我的应用程序是基于 Java 6 的,我希望将外部依赖项减少到最低限度。

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

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

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

4

3 回答 3

8

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

于 2009-06-20T18:29:51.250 回答
1

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

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

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

于 2009-06-20T18:34:23.813 回答
0

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

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

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

于 2009-06-20T19:07:02.017 回答