隨筆 - 22  文章 - 467  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(25)

          隨筆分類(74)

          文章分類(1)

          收藏夾(277)

          在線工具

          在線資料

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 217624
          • 排名 - 261

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          因?yàn)樵谧龅囊粋€(gè)小應(yīng)用里面用到了JNI的SQLite驅(qū)動(dòng),需要使用一個(gè)sqlite_jni.dll.

          所以程序打包成jar文件發(fā)布的時(shí)候需要連帶一個(gè)sqlite_jni.dll放在jar同目錄或者放到系統(tǒng)的path中
          就覺(jué)得很麻煩,希望能做成單文件的.

          折騰了半天之后才弄出來(lái)這個(gè)方法可以把程序自身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的位置寫(xiě)死了,位于jar文件里面的bin/lib文件夾中,用

          InputStream in = this.getClass().getClassLoader().getResourceAsStream("bin/lib/sqlite_jni.dll");

          把資源讀取為InputStream

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

          private static int copy(InputStream input, OutputStream output)

          這個(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文件啦.
          posted on 2010-11-17 01:39 ApolloDeng 閱讀(1913) 評(píng)論(4)  編輯  收藏 所屬分類: 分享Java

          FeedBack:
          # re: 分享一個(gè)讓程序從自己的jar文件中取出資源文件存儲(chǔ)到文件系統(tǒng)的方法 2010-11-17 11:43 硫化黑
          感謝博主的分享,  回復(fù)  更多評(píng)論
            
          # re: 分享一個(gè)讓程序從自己的jar文件中取出資源文件存儲(chǔ)到文件系統(tǒng)的方法 2010-11-20 22:23 pengo
          補(bǔ)充:
          用Eclipse導(dǎo)出可執(zhí)行的jar文件.默認(rèn)是不會(huì)包括dll文件的

          Eclipse自帶的打包功能很簡(jiǎn)漏的.給Eclipse裝上插件fatjar吧.  回復(fù)  更多評(píng)論
            
          # re: 分享一個(gè)讓程序從自己的jar文件中取出資源文件存儲(chǔ)到文件系統(tǒng)的方法 2010-12-31 17:04 Aloong
          @pengo
          謝謝提醒 ^ ^  回復(fù)  更多評(píng)論
            
          # re: 分享一個(gè)讓程序從自己的jar文件中取出資源文件存儲(chǔ)到文件系統(tǒng)的方法 2011-12-10 21:43 tbw淘寶商城
          0000000000000000000000000000000000000看了看蠻復(fù)雜  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 浦东新区| 乌鲁木齐县| 常德市| 鹤壁市| 尼勒克县| 綦江县| 景宁| 项城市| 承德市| 丰县| 建德市| 丰城市| 寿光市| 石首市| 霍邱县| 芜湖市| 永丰县| 绥中县| 北京市| 徐水县| 沐川县| 金华市| 塘沽区| 册亨县| 萍乡市| 甘孜| 石屏县| 林芝县| 饶河县| 桃源县| 玉树县| 海安县| 赫章县| 临城县| 连城县| 夏邑县| 宜兰县| 军事| 大足县| 延津县| 莆田市|