国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java讀取zip/jar包中的文件

這篇具有很好參考價(jià)值的文章主要介紹了java讀取zip/jar包中的文件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、jar vs zip:

jar 文件和 zip 文件都是歸檔文件,并且都經(jīng)過壓縮。事實(shí)上,jar 文件使用與 zip 文件相同的存檔和壓縮技術(shù),所以 jar 文件實(shí)際上是一種特定類型的 zip 文件。(JAR 文件本質(zhì)上是一個(gè)包含可選 META-INF 目錄的 zip 文件。)這一切都意味著:

  • 您可以使用與打開 zip 文件相同的工具打開 jar 文件
  • jar 文件是 zip 文件的子集,因此如果 zip 文件遵循 jar 規(guī)范,則它可以用作 jar 文件

2、讀取zip壓縮文件:

1)方法一:通過ZipFile從文件中讀取

private static void readZipFile() {
    try (ZipFile zipFile = new ZipFile("/data/testzip.zip");) {
	    Enumeration<? extends ZipEntry> entries = zipFile.entries();
         while(entries.hasMoreElements()){
             ZipEntry entry = entries.nextElement();
		 System.out.println("fileName:"+entry.getName()); //文件名
		 InputStream stream = zipFile.getInputStream(entry); //讀取文件內(nèi)容
		 read(stream);
         }
    } catch(Exception e) {}
	//zipFile.close();
}
private static void read(InputStream in) { 
    try (InputStreamReader reader = new InputStreamReader(in, "UTF-8");
         BufferedReader br = new BufferedReader(reader);) {
         String con = null;
	      while ((con = br.readLine()) != null) {
	          System.out.println(con);
	      }
    } catch (Exception e) {}
}

2)方法二:通過ZipInputStream從流中讀取

private static InputStream getInputStream() throws FileNotFoundException {
	File file = new File("/data/testzip.zip");
	InputStream in = new FileInputStream(file);
	return in;
}
//錯(cuò)誤方法
private static void readZipInputStream() throws FileNotFoundException, IOException {
	InputStream zippedIn = getInputStream(); // zip壓縮文件流
	ZipInputStream zis = new ZipInputStream(zippedIn);
	read(zis); //讀取的是空
}
//正確方法
private static void readZipInputStream2() throws FileNotFoundException, IOException {
	InputStream zipFileInput = getInputStream(); // zip壓縮文件流
	ZipInputStream zis = new ZipInputStream(zipFileInput);
	ZipEntry entry = null;
	try {
		while ((entry = zis.getNextEntry()) != null) {
			try {
				final String name = entry.getName();
				System.out.println("fileName:"+name);
				String content = IOUtils.toString(zis);
				System.out.println(content);
			} finally {
				zis.closeEntry(); // 關(guān)閉zipEntry
			}
		}
	} finally {
		zis.close(); //關(guān)閉zipInputStream
	}
}

注意:在從流中讀取數(shù)據(jù)是使用了IOUtils,原因是自定義read方法讀取完后會(huì)把傳遞進(jìn)來的inputStream給關(guān)閉了。如果zip包中有多個(gè)文件,那么在讀取第二個(gè)entry文件時(shí)就會(huì)報(bào)錯(cuò)。zipInputStream只能在最后關(guān)閉。而IOUtils使用了copy的方式,不會(huì)關(guān)閉傳入的流

3、jar中文件/目錄便利,以及讀?。?/h4>

1)方法一:使用JarFile讀取Jar文件

和ZipFile類似,使用'getEntry(String name)'或'entires'獲得ZipEntry或JarEntry(它們可以看作同一東西),接下來使用" JarFile.getInputStream(ZipEntry ze)"將其用于獲取InputStream

static void test1() {
    String path = "/Users/liuxiao/maven-rep/org/apache/thrift/libthrift/0.9.0/libthrift-0.9.0.jar";
    try (JarFile jarFile = new JarFile(new File(path));) {
        Enumeration<JarEntry> entries = jarFile.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            String entryName = entry.getName();
            if (!entry.isDirectory() && entryName.equals("org/apache/thrift/TBase.java")) {
                System.out.println(entryName);//  org/apache/thrift/EncodingUtils.class
                read(jarFile.getInputStream(entry));
            }
        }
    } catch (Exception e) {
    }
    //使用stream api
try (Stream<JarEntry> stream = new JarFile(new File(path)).stream();) {
        stream
            .filter(entry -> !entry.isDirectory() && entry.getName().endsWith(".class"))
            .forEach(entry -> System.out.println(entry.getName()));
    } catch(Exception e) {
    }
}

2)方法二:通過JarInputStream從流中讀取(和ZipInputStream類似)

private static InputStream getJarFileInputStream() throws FileNotFoundException {
	File file = new File("/data/mvn_repo/commons-lang/commons-lang/2.1/commons-lang-2.1.jar");
	InputStream in = new FileInputStream(file);
	return in;
}
private static void readJarInputStream2() throws FileNotFoundException, IOException {
	InputStream zipFileInput = getJarFileInputStream(); // jar包流
	JarInputStream jis = new JarInputStream(zipFileInput);
	JarEntry entry = null;
	try {
		while ((entry = jis.getNextJarEntry()) != null) {
			try {
				if (entry.isDirectory()) {
					continue;
				}
				final String name = entry.getName();
				System.out.println("fileName:"+name);
				String content = IOUtils.toString(jis);
				System.out.println(content);
			} finally {
				jis.closeEntry(); // 關(guān)閉zipEntry
			}
		}
	} finally {
		jis.close(); //關(guān)閉zipInputStream
	}
}

3)方法三:通過JarURLConnection來打開一個(gè)jar中的資源,然后通過流來讀取?

static void test2() throws Exception {
	String filePath = "/Users/liuxiao/maven-rep/org/apache/thrift/libthrift/0.9.0/libthrift-0.9.0.jar";
	String name = "org/apache/thrift/TBase.java";
	
	URL url = new URL("jar:file:" + filePath + "!/" + name);
	JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
	try (InputStream in = jarConnection.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));) {
		String con = null;
		while ((con = br.readLine()) != null) {
			System.out.println(con);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

總結(jié):

由于zip和jar結(jié)構(gòu)時(shí)一致的,所以ZipFile和JarFile,ZipInputStream和JarInputStream的使用方法是一樣的。需要說明的一點(diǎn)是,由于zip包的這種特殊結(jié)構(gòu),默認(rèn)ZipInputStream中是不包含數(shù)據(jù)的,只有在調(diào)用getNextEntry方法后,才回把對(duì)應(yīng)的entry(zip包中的一個(gè)文件)內(nèi)容寫入到ZipInputStream中。上面的一個(gè)錯(cuò)誤寫法中,可以看到直接從ZipInputStream中讀不到數(shù)據(jù),只有調(diào)用getNextEntry后才可以。文章來源地址http://www.zghlxwxcb.cn/news/detail-563718.html

到了這里,關(guān)于java讀取zip/jar包中的文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 報(bào)錯(cuò):java: 讀取D:\XX\XXX.jar時(shí)出錯(cuò); error in opening zip file[有效解決方案]

    報(bào)錯(cuò):java: 讀取D:\XX\XXX.jar時(shí)出錯(cuò); error in opening zip file[有效解決方案]

    一般是在idea構(gòu)建項(xiàng)目時(shí)報(bào)的錯(cuò)誤。 原因:1、在構(gòu)建項(xiàng)目時(shí)中止構(gòu)建,導(dǎo)致jar下載失敗或者下載的jar包殘缺無法打開使用。 ? ? 2、構(gòu)建好項(xiàng)目后,更換idea的maven版本,導(dǎo)致maven的本地倉庫改變,無法加載之前構(gòu)建好的環(huán)境,或者打不開之前下載的jar包 ? ? 3、依賴的jar因?yàn)槟?/p>

    2024年02月11日
    瀏覽(23)
  • 更新spring boot jar包中的BOOT-INF/lib目錄下的jar包

    更新spring-boot jar包中的BOOT-INF/lib目錄下的jar包 場景 需要更新lib目錄下某個(gè)jar包的配置文件 失敗的解決方法 用解壓軟件依次打開spring-boot jar包(設(shè)為a.jar)、BOOT-INF/lib目錄下的jar包(設(shè)為b.jar),然后修改配置文件后保存回a.jar包中,這樣操作在通過java -jar運(yùn)行a.jar包時(shí)會(huì)導(dǎo)致

    2024年02月13日
    瀏覽(15)
  • java 解讀zip文件,獲取壓縮包內(nèi)各文件的流的集合

    解讀zip文件,把zip文件內(nèi)的眾文件轉(zhuǎn)化成流集合,方便其他后續(xù)操作

    2024年02月10日
    瀏覽(21)
  • SpringBoot打包成WAR包的時(shí)候把第三方j(luò)ar包打到LIB文件夾下和把第三方j(luò)ar包打入到SpringBoot jar包中

    SpringBoot打包成WAR包的時(shí)候把第三方j(luò)ar包打到LIB文件夾下和把第三方j(luò)ar包打入到SpringBoot jar包中

    轉(zhuǎn)載 首先我們應(yīng)該知道我們把 SPRINGBOOT 項(xiàng)目打包成WAR包和JAR包的時(shí)候分別需要何種插件 我們最常用的把 springBoot 打成jar包的插件是下面這樣的一個(gè)插件,這是把我們的 springBoot 項(xiàng)目打包成為一個(gè)可執(zhí)行 jar 的插件 把 springBoot 項(xiàng)目打包成一個(gè)war包的插件是下面這樣的一個(gè)插件

    2024年02月07日
    瀏覽(24)
  • 解析獲取華為手表主題watchface hwt擴(kuò)展名的包中的素材

    解析獲取華為手表主題watchface hwt擴(kuò)展名的包中的素材

    沒有做UI的能力,確總有顆做UI心。 看誰做的UI都不爽,自己做的比誰都垃圾。 沒錯(cuò),就是本人了。 最近盯上了手表表盤UI,作為程序猿,與普通用戶思維不大一樣,一般人想怎么裝到手表上,我想的是,這些UI,素材拿來給我用有多想,嘿嘿嘿。。。 淘寶隨便買了幾百個(gè)手

    2024年02月11日
    瀏覽(119)
  • Java獲取Jar、War包路徑,并生成可編輯修改的本地配置文件

    Java獲取Jar、War包路徑,并生成可編輯修改的本地配置文件

    本地的可修改配置文件的編寫理應(yīng)是一個(gè)很常用的功能,但由于數(shù)據(jù)庫的存在,它鮮少被提及,大多數(shù)我們直接存儲(chǔ)到數(shù)據(jù)庫中了。 以至于現(xiàn)今,除了沒接觸數(shù)據(jù)庫的新手時(shí)常使用它以外,它沒有太多的出場機(jī)會(huì)。 也因此,其實(shí)很多人不太了解其中的存儲(chǔ)機(jī)制以及可能存在

    2024年01月25日
    瀏覽(21)
  • 用bat 命令 修改sql文件中的數(shù)據(jù)庫名字 新的名字通過讀取配置文件中的字段獲取

    在批處理腳本中,如果新數(shù)據(jù)庫名存儲(chǔ)在配置文件(比如config.ini)中的某個(gè)字段內(nèi),可以按照以下步驟進(jìn)行: 假設(shè)你的配置文件內(nèi)容如下: 要讀取這個(gè)值并用于替換.sql文件中的舊數(shù)據(jù)庫名,請(qǐng)使用以下批處理腳本: 在這個(gè)腳本中,首先通過 findstr 和 for /f 命令組合讀取配置

    2024年02月02日
    瀏覽(25)
  • 【Java用法】windows10系統(tǒng)下修改jar中的文件并重新打包成jar文件然后運(yùn)行

    【Java用法】windows10系統(tǒng)下修改jar中的文件并重新打包成jar文件然后運(yùn)行

    測試環(huán)境(Linux)的代碼(jar包)拉取到本地電腦(Windows10),然后連接本地電腦上的數(shù)據(jù)庫并在本地電腦運(yùn)行。 前提:Windows10電腦,jar包文件,本地電腦已安裝好MySQL數(shù)據(jù)庫。 需求:需要將下面jar包中配置文件的數(shù)據(jù)庫連接地址修改成本地電腦連接地址,并把修改后的配置

    2024年02月12日
    瀏覽(20)
  • Flink使用JavaAgent進(jìn)行字節(jié)碼修改的文件錯(cuò)誤:無法打開ZIP文件或JAR清單丟失

    Flink使用JavaAgent進(jìn)行字節(jié)碼修改的文件錯(cuò)誤:無法打開ZIP文件或JAR清單丟失 在大數(shù)據(jù)領(lǐng)域,Apache Flink是一個(gè)強(qiáng)大的流處理和批處理框架,它提供了許多功能和工具來處理大規(guī)模數(shù)據(jù)集。在某些情況下,我們可能需要對(duì)Flink應(yīng)用程序的字節(jié)碼進(jìn)行修改,以實(shí)現(xiàn)一些定制化的需求

    2024年03月16日
    瀏覽(28)
  • Java如何快速讀取&解析JSON數(shù)據(jù)(文件),獲取想要的內(nèi)容?

    Java如何快速讀取&解析JSON數(shù)據(jù)(文件),獲取想要的內(nèi)容?

    手打不易,如果轉(zhuǎn)摘,請(qǐng)注明出處! 注明原文: https://zhangxiaofan.blog.csdn.net/article/details/132764186 目錄 前言 準(zhǔn)備工作 Json數(shù)據(jù)(示例) 解析Json文件 第一步:創(chuàng)建一個(gè)空類 第二步:使用?Gsonformat 插件 ?第三步:復(fù)制Json內(nèi)容,創(chuàng)建對(duì)應(yīng)類 第四步:讀取Json文件,提取目標(biāo)數(shù)據(jù)

    2024年02月05日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包