我有一个用Java编写的应用程序,它使用一个jar文件(它使用多个,但这不是重点)。
事实是,我正在使用的Jar文件包含我绝对必须提取到文件系统的文件。
到目前为止,我正在使用Class.getResourceAsStream和FileOutputStream,但此方法有点慢。 请注意,其中一些文件是基于文本的,但其他文件只是二进制文件。
除了尝试减少从JAR中提取文件的需要之外,还有针对这些任务的任何优化(例如更充分的功能)。
请注意,我的应用程序是基于Java 6的,我希望将外部依赖性降至最低。
编辑:为了将来参考,我的 OLD (inefficent)代码是:
int c;
while((c = is.read())!=-1){
fos.write(c);
}
对于新的,更快的代码,请参阅接受的回复。
答案 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件事会使提取更快:
我认为需要提取是由于需要从文件写入/重新读取。如果文件足够小,则内存足够大,并且文件的持久性不是必需的;您可以考虑将整个资源映射到内存,而不是将磁盘用作存储。