所以程序打包成jar文件發(fā)布的時(shí)候需要連帶一個(gè)sqlite_jni.dll放在jar同目錄或者放到系統(tǒng)的path中
就覺(jué)得很麻煩,希望能做成單文件的.
折騰了半天之后才弄出來(lái)這個(gè)方法可以把程序自身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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

下面的代碼里面把sqlite_jni.dll的位置寫死了,位于jar文件里面的bin/lib文件夾中,用

把資源讀取為InputStream
而OutputStream則被實(shí)例化為FileOutputStream對(duì)象,輸出dll文件到與jar文件同級(jí)目錄下:

這個(gè)方法把InputStream的內(nèi)容拷貝到傳入的FileOutputStream實(shí)例中,即可實(shí)現(xiàn)文件的輸出.
然后在整個(gè)程序開(kāi)始的時(shí)候判斷一下sqlite_jni.dll文件是否存在,如果不存在就調(diào)用copyDll()方法把dll文件從jar中取出來(lái).
補(bǔ)充:
用Eclipse導(dǎo)出可執(zhí)行的jar文件.默認(rèn)是不會(huì)包括dll文件的,所以我是在導(dǎo)出之后
用7_zip解壓縮軟件打開(kāi)jar,在里面新建bin/lib兩層目錄再把dll文件拷入其中
之后直接執(zhí)行jar文件就會(huì)在當(dāng)前文件夾中釋放出dll文件啦.