因為在做的一個小應用里面用到了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 閱讀(1911)
評論(4) 編輯 收藏 所屬分類:
分享 、
Java