随笔 - 22  文章 - 467  trackbacks - 0
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(25)

随笔分类(74)

文章分类(1)

收藏夹(277)

在线工具

在线资料

最新随笔

搜索

  •  

积分与排名

  • 积分 - 216772
  • 排名 - 260

最新评论

阅读排行榜

评论排行榜

因为在做的一个小应用里面用到了JNI的SQLite驱动,需要使用一个sqlite_jni.dll.

所以程序打包成jar文件发布的时候需要连带一个sqlite_jni.dll放在jar同目录或者放到系统的path中
就觉得很麻烦,希望能做成单文件的.

折腾了半天之后才弄出来这个方法可以把程序自身jar里的资源拷贝到外部文件夹的方法

代码如下:

 1import java.io.File;
 2import java.io.FileOutputStream;
 3import java.io.IOException;
 4import java.io.InputStream;
 5import java.io.OutputStream;
 6
 7public 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 阅读(1884) 评论(4)  编辑  收藏 所属分类: 分享Java

FeedBack:
# re: 分享一个让程序从自己的jar文件中取出资源文件存储到文件系统的方法 2010-11-17 11:43 硫化黑
感谢博主的分享,  回复  更多评论
  
# re: 分享一个让程序从自己的jar文件中取出资源文件存储到文件系统的方法 2010-11-20 22:23 pengo
补充:
用Eclipse导出可执行的jar文件.默认是不会包括dll文件的

Eclipse自带的打包功能很简漏的.给Eclipse装上插件fatjar吧.  回复  更多评论
  
# re: 分享一个让程序从自己的jar文件中取出资源文件存储到文件系统的方法 2010-12-31 17:04 Aloong
@pengo
谢谢提醒 ^ ^  回复  更多评论
  
# re: 分享一个让程序从自己的jar文件中取出资源文件存储到文件系统的方法 2011-12-10 21:43 tbw淘宝商城
0000000000000000000000000000000000000看了看蛮复杂  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: