<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(25)

    隨筆分類(74)

    文章分類(1)

    收藏夾(277)

    在線工具

    在線資料

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 217577
    • 排名 - 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的位置寫死了,位于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 閱讀(1911) 評(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)論
      
    主站蜘蛛池模板: 亚洲精品一级无码中文字幕| 亚洲AV成人无码久久WWW| 亚洲第一黄片大全| 无人影院手机版在线观看免费| 久久免费视频网站| 久久er国产精品免费观看8| 亚洲欧美在线x视频| 亚洲 日韩经典 中文字幕| 亚洲日本一区二区| 亚洲精品中文字幕无码蜜桃| 免费人成年激情视频在线观看| 免费的涩涩视频在线播放| 国产成人免费网站| 亚洲三级在线免费观看| 久久99精品视免费看| 99久久99这里只有免费的精品 | 麻豆一区二区免费播放网站| 亚欧免费无码aⅴ在线观看| 任你躁在线精品免费| 成年女人A毛片免费视频| 国产午夜精品理论片免费观看 | 亚洲国产一区二区视频网站| 国产乱人免费视频| 国产精品久免费的黄网站| 国产性生交xxxxx免费| 日本免费人成视频播放| 在线视频免费国产成人| 四虎在线免费播放| 免费无码又爽又刺激高潮| 日本黄色免费观看| 亚洲高清最新av网站| 国产成人亚洲影院在线观看| 久久久无码精品亚洲日韩软件 | 高潮内射免费看片| 黄色免费网址在线观看| 日产久久强奸免费的看| 亚洲天堂免费在线视频| 国产免费网站看v片在线| 久久综合给合久久国产免费 | 亚洲精品人成网线在线播放va| 亚洲色偷偷色噜噜狠狠99网|