因为在做的一个小应用里面用到了JNI的SQLite驱动,需要使用一个sqlite_jni.dll.
所以程序打包成jar文件发布的时候需要连带一个sqlite_jni.dll放在jar同目录或者放到系统的path中
就觉得很麻烦,希望能做成单文件的.
折腾了半天之后才弄出来这个方法可以把程序自身jar里的资源拷贝到外部文件夹的方法
代码如下:
1
import java.io.File;
2
import java.io.FileOutputStream;
3
import java.io.IOException;
4
import java.io.InputStream;
5
import java.io.OutputStream;
6
7
public class CopyDll
8

{
9
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
10
void copyDll() throws Exception
11
{
12
InputStream in = this.getClass().getClassLoader()
13
.getResourceAsStream("bin/lib/sqlite_jni.dll");
14
File file2 = new File("sqlite_jni.dll");
15
FileOutputStream out = new FileOutputStream(file2);
16
copy(in, out);
17
in.close();
18
out.close();
19
}
20
21
private static void copy(InputStream input, OutputStream output)
22
throws IOException
23
{
24
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
25
int n = 0;
26
while (-1 != (n = input.read(buffer)))
27
{
28
output.write(buffer, 0, n);
29
}
30
}
31
}
下面的代码里面把sqlite_jni.dll的位置写死了,位于jar文件里面的bin/lib文件夹中,用
InputStream in = this.getClass().getClassLoader().getResourceAsStream("bin/lib/sqlite_jni.dll");
把资源读取为InputStream
而OutputStream则被实例化为FileOutputStream对象,输出dll文件到与jar文件同级目录下:
private static int copy(InputStream input, OutputStream output)
这个方法把InputStream的内容拷贝到传入的FileOutputStream实例中,即可实现文件的输出.
然后在整个程序开始的时候判断一下sqlite_jni.dll文件是否存在,如果不存在就调用copyDll()方法把dll文件从jar中取出来.
补充:
用Eclipse导出可执行的jar文件.默认是不会包括dll文件的,所以我是在导出之后
用7_zip解压缩软件打开jar,在里面新建bin/lib两层目录再把dll文件拷入其中
之后直接执行jar文件就会在当前文件夹中释放出dll文件啦.
posted on 2010-11-17 01:39
ApolloDeng 阅读(1900)
评论(4) 编辑 收藏 所属分类:
分享 、
Java