欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實現(xiàn)讀取jar包中配置文件的幾種方式

 更新時間:2023年06月15日 11:33:43   作者:奔跑吧人生  
本文主要介紹了java實現(xiàn)讀取jar包中配置文件的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

概述

在編程的某些情況下,我們需要讀取jar包中的文件,這種情況要區(qū)別于我們平時使用類加載器讀取配置文件,這個時候配置在jar包中,就能讀取到,但是配置文件也可以不在jar包中,只要放在Class-Path下就行了,所以這種情況下,我更愿意把它稱之為:讀取Class-Path下的配置文件。而我今天描述的比較明確,就是要讀取jar包中的文件。這種需求可能不多,但是我碰見了,并且發(fā)現(xiàn)了幾種,今天全部羅列分享一下。

目前有3種:

  • JarFile
  • URL
  • ClassLoader

定義接口

因為有好幾種方式,那就直接定義個接口:

public interface JarReader {
   /**
     * 讀取jar包中的文件
     * @param jarPath   jar包路徑
     * @param file  jar包中的文件路徑
     * @return  文件內容,轉換成字符串了,其它需求也可以轉換成輸入流。
     * @throws IOException
     */
    String readFromJar(String jarPath,String file) throws IOException;
}

jar包讀取器,jar包中的文件讀取出來。

通過JarFile讀取

JarFile是java自帶的一種讀取jar包的API,很多人應該用過,我就直接貼代碼了。public class JarFileJarReader implements JarReader {
? ? @Override
? ? public String readFromJar(String jarPath,String file) throws IOException {
? ? ? ? JarFile jarFile=null;
? ? ? ? try {
? ? ? ? ? ? jarFile=new JarFile(jarPath);
? ? ? ? ? ? JarEntry jarEntry=jarFile.getJarEntry(file);
? ? ? ? ? ? InputStream input=jarFile.getInputStream(jarEntry);
? ? ? ? ? ? return IOUtils.toString(input,"UTF-8");
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? throw e;
? ? ? ? } finally {
? ? ? ? ? ? IOUtils.closeQuietly(jarFile);
? ? ? ? }
? ? }
}

代碼也比較簡單,重點就是最后一定要把jarFile這個對象關閉一下,中間的輸入流都可以不用關閉。

不過我在寫這段代碼之前,從我的個人經驗上來說,JarFile好像更多是用來讀取清單文件(MANIFEST.MF)的,可能是見這種情況比較多,當然它的用途肯定遠不止如此。
因此我順便寫了一下讀取清單文件的代碼:

public void getManiFest(String jarPath) throws IOException {
? ? ? ? JarFile jarFile=null;
? ? ? ? try {
? ? ? ? ? ? jarFile=new JarFile(jarPath);
? ? ? ? ? ? Manifest manifest=jarFile.getManifest();
? ? ? ? ? ? if (manifest!=null){
? ? ? ? ? ? ? ? //獲取Class-Path
? ? ? ? ? ? ? ? String classPaths = (String) manifest.getMainAttributes().get(new Attributes.Name("Class-Path"));
? ? ? ? ? ? ? ? if (classPaths != null && !classPaths.isEmpty()) {
? ? ? ? ? ? ? ? ? ? String[] classPathArray = classPaths.split(" ");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //獲取JDK版本
? ? ? ? ? ? ? ? String jdkVersion = (String) manifest.getMainAttributes().get(new Attributes.Name("Build-Jdk"));
? ? ? ? ? ? ? ? //還可以獲取其它內容,比如Main-Class等等
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? throw e;
? ? ? ? } finally {
? ? ? ? ? ? IOUtils.closeQuietly(jarFile);
? ? ? ? }
? ? }

通過URL讀取

java自帶的URL是支持讀取jar中的文件的,協(xié)議是jar,表示方式的話是用"/!"把jar包和文件區(qū)分一下。代碼如下:

public class URLJarReader implements JarReader {
    @Override
    public String readFromJar(String jarPath, String file) throws IOException {
        JarURLConnection jarURLConnection=null;
        try {
            URL fileUrl=ParseUtil.fileToEncodedURL(new File(jarPath));
            URL jarUrl=new URL("jar", "", -1, fileUrl + "!/");
            URL moduleUrl = new URL(jarUrl, ParseUtil.encodePath(file, false));
            jarURLConnection = (JarURLConnection)moduleUrl.openConnection();
            return IOUtils.toString(jarURLConnection.getInputStream(),"UTF-8");
        } catch (IOException e) {
            throw e;
        } finally {
            if (jarURLConnection!=null){
                try {
                    jarURLConnection.getJarFile().close();
                } catch (IOException ignore) {
                }
            }
        }
    }
}

ParseUtil的幾個方法是我在看java源碼的時候看見的,用來處理一些不規(guī)則的文件路徑。

我剛開始用URL的時候,就出現(xiàn)了一個內存泄漏的文件,讀取完了以后,jar包被占用,死活不能刪除,剛才開始把輸入流給關閉了,也沒有用。然后想到了類加載器里面有close方法,然后去看了一下,找到了上述代碼中的finally塊的代碼。這樣就可以把占用問題解決了,仔細看的話,會發(fā)現(xiàn),getJarFile.close(),因此本質上還是關閉了JarFile,和上面是一樣的。

通過ClassLoader

這個也是借鑒了我們平時讀取配置文件的方式,借用一下ClassLoader來讀取。

public class ClassLoaderJarReader implements JarReader {
    @Override
    public String readFromJar(String jarPath, String file) throws IOException{
        URLClassLoader urlClassLoader=null;
        try {
            URL fileUrl=ParseUtil.fileToEncodedURL(new File(jarPath));
            urlClassLoader=new URLClassLoader(new URL[]{fileUrl},null);
            InputStream inputStream=urlClassLoader.getResourceAsStream(file);
            if (inputStream==null){
                throw new FileNotFoundException("not find file:"+file+" in jar:"+jarPath);
            }else{
                return IOUtils.toString(inputStream,"UTF-8");
            }
        } catch (IOException e) {
            throw e;
        } finally {
            IOUtils.closeQuietly(urlClassLoader);
        }
    }
}

代碼也是比較簡單,最后把ClassLoader關閉一下就行了。

關于類加載器的讀取方式,我很早之前就看過了,它本質上用的就是上面兩種方式結合起來讀取文件的。

總結

這幾種方式的話,其實沒有什么區(qū)別,從開發(fā)角度來說的話,比較推薦第三種,因為是java自帶的功能,也是比較完善,也簡單,也不容易出錯,而且它內部用的就是前面兩種。不過從資源消耗上面來說,我猜測,前面兩種應該占優(yōu),不過我也不糾結這個,沒去研究。

有時候我們或許有另外一種需求,讀取jar中的jar中的文件,這個在一些場景下,會使用到。最起碼spring-boot確實是用到了,很早之前我看過它的實現(xiàn),它就是把URL重寫了一下,支持了一下多個"/!"表達式,就能夠支持這種情況了。

到此這篇關于java實現(xiàn)讀取jar包中配置文件的幾種方式的文章就介紹到這了,更多相關java 讀取jar包配置文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mybatis結果集映射與生命周期詳細介紹

    Mybatis結果集映射與生命周期詳細介紹

    結果集映射指的是將數據表中的字段與實體類中的屬性關聯(lián)起來,這樣 MyBatis 就可以根據查詢到的數據來填充實體對象的屬性,幫助我們完成賦值操作
    2022-10-10
  • Java工廠模式之簡單工廠,工廠方法,抽象工廠模式詳解

    Java工廠模式之簡單工廠,工廠方法,抽象工廠模式詳解

    這篇文章主要為大家詳細介紹了Java工廠模式之簡單工廠、工廠方法、抽象工廠模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • LinkedBlockingQueue鏈式阻塞隊列的使用和原理解析

    LinkedBlockingQueue鏈式阻塞隊列的使用和原理解析

    這篇文章主要介紹了LinkedBlockingQueue鏈式阻塞隊列的使用和原理解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 詳解Spring bean的注解注入之@Autowired的原理及使用

    詳解Spring bean的注解注入之@Autowired的原理及使用

    之前講過bean注入是什么,也使用了xml的配置文件進行bean注入,這也是Spring的最原始的注入方式(xml注入).本文主要講解的注解有以下幾個:@Autowired、 @Service、@Repository、@Controller 、@Component、@Bean、@Configuration、@Resource ,需要的朋友可以參考下
    2021-06-06
  • eclipse創(chuàng)建一個基于maven的web項目詳細步驟

    eclipse創(chuàng)建一個基于maven的web項目詳細步驟

    開始學習maven,并用maven創(chuàng)建了第一個屬于自己的web項目,下面這篇文章主要給大家介紹了關于eclipse創(chuàng)建一個基于maven的web項目的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Maven?Pom?文件中的隱式依賴導致Jar沖突問題

    Maven?Pom?文件中的隱式依賴導致Jar沖突問題

    這篇文章主要介紹了Maven?Pom?文件中的隱式依賴導致Jar沖突問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • BufferedInputStream(緩沖輸入流)詳解_動力節(jié)點Java學院整理

    BufferedInputStream(緩沖輸入流)詳解_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了BufferedInputStream緩沖輸入流的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java中?springcloud.openfeign應用案例解析

    Java中?springcloud.openfeign應用案例解析

    使用OpenFeign能讓編寫Web?Service客戶端更加簡單,使用時只需定義服務接口,然后在上面添加注解,OpenFeign也支持可拔插式的編碼和解碼器,這篇文章主要介紹了Java中?springcloud.openfeign應用案例解析,需要的朋友可以參考下
    2024-06-06
  • Java高性能本地緩存框架Caffeine的實現(xiàn)

    Java高性能本地緩存框架Caffeine的實現(xiàn)

    本文主要介紹了Java高性能本地緩存框架Caffeine的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 一文詳細講解Java時間格式轉換

    一文詳細講解Java時間格式轉換

    這篇文章主要介紹了Java時間格式轉換的相關資料,文中詳細介紹了SimpleDateFormat(適用于Java8之前)和java.time(適用于Java8及之后)的用法,需要的朋友可以參考下
    2024-12-12

最新評論