我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java读取zip/jar包中的文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java读取zip/jar包中的文件

1、jar vs zip:

jar 文件和 zip 文件都是归档文件,并且都经过压缩。事实上,jar 文件使用与 zip 文件相同的存档和压缩技术,所以 jar 文件实际上是一种特定类型的 zip 文件。(JAR 文件本质上是一个包含可选 META-INF 目录的 zip 文件。)这一切都意味着:

  • 您可以使用与打开 zip 文件相同的工具打开 jar 文件
  • jar 文件是 zip 文件的子集,因此如果 zip 文件遵循 jar 规范,则它可以用作 jar 文件

2、读取zip压缩文件:

1)方法一:通过ZipFile从文件中读取

private static void readZipFile() {    try (ZipFile zipFile = new ZipFile("/data/testzip.zip");) {    Enumeration entries = zipFile.entries();         while(entries.hasMoreElements()){             ZipEntry entry = entries.nextElement(); System.out.println("fileName:"+entry.getName()); //文件名 InputStream stream = zipFile.getInputStream(entry); //读取文件内容 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;}//错误方法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(); // 关闭zipEntry}}} finally {zis.close(); //关闭zipInputStream}}

注意:在从流中读取数据是使用了IOUtils,原因是自定义read方法读取完后会把传递进来的inputStream给关闭了。如果zip包中有多个文件,那么在读取第二个entry文件时就会报错。zipInputStream只能在最后关闭。而IOUtils使用了copy的方式,不会关闭传入的流

3、jar中文件/目录便利,以及读取:

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 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 apitry (Stream 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(); // 关闭zipEntry}}} finally {jis.close(); //关闭zipInputStream}}

3)方法三:通过JarURLConnection来打开一个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();}}

总结:

由于zip和jar结构时一致的,所以ZipFile和JarFile,ZipInputStream和JarInputStream的使用方法是一样的。需要说明的一点是,由于zip包的这种特殊结构,默认ZipInputStream中是不包含数据的,只有在调用getNextEntry方法后,才回把对应的entry(zip包中的一个文件)内容写入到ZipInputStream中。上面的一个错误写法中,可以看到直接从ZipInputStream中读不到数据,只有调用getNextEntry后才可以。

来源地址:https://blog.csdn.net/liuxiao723846/article/details/130967940

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java读取zip/jar包中的文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java如何读取jar包下的配置文件

可以使用Java中的ClassLoader来读取jar包下的配置文件。使用ClassLoader的getResourceAsStream方法来读取jar包下的配置文件,代码示例如下:```javaimport java.io.IOExcep
2023-09-17

java怎么读取jar包下的配置文件

在Java中,可以使用以下代码读取JAR包中的配置文件:```javaimport java.io.InputStream;import java.util.Properties;public class ReadConfigFile {p
2023-09-16

java怎么读取zip文件

要读取zip文件,可以使用Java的java.util.zip包中的ZipInputStream类来实现。下面是一个简单的示例代码,演示了如何读取zip文件中的内容:import java.io.FileInputStream;impo
2023-10-26

python怎么读取zip包内文件

可以使用`zipfile`模块来读取zip包内的文件。下面是一个使用示例:import zipfile# 打开zip包with zipfile.ZipFile('example.zip', 'r') as zip_ref:# 获取zip
2023-10-27

Java实现从jar包中读取指定文件的方法

本文实例讲述了Java实现从jar包中读取指定文件的方法。分享给大家供大家参考,具体如下:以下的Java代码实现了从一个jar包中读取指定文件的功能:/*** This class implements the funcationality
2023-05-31

java怎么读取zip文件下的照片

要读取zip文件中的照片,可以使用Java的java.util.zip包中的ZipFile类来操作。首先,需要使用ZipFile类打开zip文件,并获取zip文件中的所有文件条目。然后,可以遍历所有文件条目,找到照片文件。最后,可以将照片
2023-10-23

Jar中的文件怎么利用Java进行读取

这期内容当中小编将会给大家带来有关Jar中的文件怎么利用Java进行读取,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java读取Jar中的文件实现代码:import java.io.IOExceptio
2023-05-31

Java读取resources中资源文件路径以及jar中文件无法读取的解决

这篇文章主要介绍了Java读取resources中资源文件路径以及jar中文件无法读取的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-20

Java如何打开 ZIP 文件以供读取

Java提供多种方法打开ZIP文件以供读取。使用Java.util.zip包,可通过ZipFile类读取ZIP条目并获得输入流。ApacheCommonsCompress库提供更全面的功能,支持获取ZIP条目列表和打开输入流。JavaNIO.2框架通过FileSystem和Files类提供了对ZIP文件的访问。开发者可根据具体需求选择最合适的选项。
Java如何打开 ZIP 文件以供读取
2024-04-02

Java读取resources中资源文件路径以及jar中文件无法读取如何解决

今天小编给大家分享的是Java读取resources中资源文件路径以及jar中文件无法读取如何解决,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。Java读取resources中资源文
2023-07-06

读取位于密码保护 zip 文件中的 CSV 文件

大家好,今天本人给大家带来文章《读取位于密码保护 zip 文件中的 CSV 文件》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!问题内容我有这样的链接:https://s
读取位于密码保护 zip 文件中的 CSV 文件
2024-04-04

Java如何读取打开的 zip 档案中的下一个文件

Java通过ZipFile、ZipInputStream或ApacheCommonsCompress库读取ZIP档案的下一个文件。ZipFile适用于读取单个档案,ZipInputStream适用于读取多个或流中的档案,而ApacheCommonsCompress库提供高级功能。
Java如何读取打开的 zip 档案中的下一个文件
2024-04-02

Java实现读取Jar文件属性的方法详解

这篇文章主要为大家详细介绍了如何利用Java语言实现读取Jar文件属性的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2022-11-13

详解Java无需解压直接读取Zip文件和文件内容

整理文档,搜刮出一个Java无需解压直接读取Zip文件和文件内容的代码,稍微整理精简一下做下分享。package test;import java.io.BufferedInputStream; import java.io.Buffere
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录