当前位置: 首页 > article >正文

【日常记录-Java】JarFile

1. 简介

        JarFile是java.util.jar包下的一个类,其扩展了java.util.zip.ZipFile类。JarFile主要用于读取Jar文件的内容。Jar文件是一种用于存储和分发Java类文件、资源文件和元数据的文件格式,其类似于Zip压缩文件,但具有特定的用途和结构。

2. 详情

 2.1 功能

        JarFile提供了一系列方法用于从Jar文件中读取条目(如类文件、资源文件等),并获取这些条目的相关信息。方法如下:

  • entries()  : 返回一个枚举(Enumeration),包含Jar文件中的所有条目;
  • getEntry(String name)  : 根据条目的名称获取一个JarEntry对象,该对象包含条目的详细信息(如压缩大小、解压大小、时间戳等);
  • getInputStream(JarEntry entry)   : 返回一个输入流(InputStream),用于读取指定条目的内容;
  • getManifest()  :  返回Jar文件的Manifest对象,Manifest是一个包含Jar文件元数据的文件(如版本信息、主类信息等);
  • close()  :   关闭Jar文件,释放与其关联的资源;

2.2 构造方法

  • JarFile(File file): 创建一个新的JarFile对象,从指定的File对象中读取;

  • JarFile(File file, boolean verify) : 创建一个新的JarFile对象,并指定是否验证Jar文件的条目,若verify为true,则验证签名;

  • JarFile(File file, boolean verify, int mode) : 在指定模式下创建一个新的JarFile对象,mode参数用于指定打开文件的模式(如只读模式);

  • JarFile(File file, boolean verify, int mode, Runtime.Version version) : 其允许指定一个运行时版本,以便在处理多版本Jar文件时使用。多版本Jar文件是一种特殊的Jar文件,其包含针对不同Java版本的条目;

2.3 使用场景

  • 读取Jar文件中的资源:如Jar文件中的配置文件、图片等,并将它们加载到应用程序中;
  • 动态加载类:动态地加载Jar文件中的类,无需在编译时将它们包含在类路径中;这对于开发插件系统或动态扩展应用程序非常有用;
  • 验证Jar文件的完整性:若Jar文件已签名,则可以使用JarFile类的验证功能来验证Jar文件的完整性,以确保它未被篡改;

   2.4 注意事项

  • 关闭资源:使用完JarFile对象后,务必调用其close()方法来关闭文件流,以避免资源泄露;
  • 异常处理:在处理Jar文件时,可能会遇到各种异常(如IOException、SecurityException等),需要进行适当的异常处理;
  • 多版本Jar文件:若处理的是多版本Jar文件,则需要了解如何正确使用JarFile类的构造方法和相关方法进行处理;

3. 示例

// step1: 导入必要的类
import java.io.File; 
import java.util.Properties; 
import java.io.InputStream;
import java.io.IOException;  
import java.util.Enumeration;  
import java.util.jar.JarEntry;  
import java.util.jar.JarFile;


// step2: 读取
public class JarFileReader {  
    public static void main(String[] args) {  
        // step2.1: 假设JAR文件的路径是 "example.jar"  
        File jarFile = new File("example.jar");  
  
        try (JarFile jar = new JarFile(jarFile)) {  
            
            // step2.2: 获取JAR文件中的所有条目  
            Enumeration<JarEntry> entries = jar.entries();  
  
            // step2.3: 遍历条目  
            while (entries.hasMoreElements()) {  
                JarEntry entry = entries.nextElement();  
                String entryName = entry.getName();  
                System.out.println("Entry: " + entryName);  
                long size = entry.getSize();  
                long compressedSize = entry.getCompressedSize();  
                long time = entry.getTime();  
                System.out.println("  Size: " + size);  
                System.out.println("  Compressed Size: " + compressedSize);  
                System.out.println("  Time: " + time);  
  
                // step2.3: 如果需要读取条目内容,可以使用以下代码
                if (entryName.endsWith(".properties")) {  
                    try (InputStream inputStream = jar.getInputStream(entry )) {
                        Properties properties = new Properties();
                        properties.load(inputStream);
                        String property = properties.getProperty("属性名");
                    }
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

http://www.kler.cn/a/375527.html

相关文章:

  • KPRCB结构之ReadySummary和DispatcherReadyListHead
  • ubuntu禁止自动更新设置
  • Cuda By Example - 12 (Texture Memory)
  • 【大数据学习 | kafka】producer端的回调和ack
  • 分享几款开源好用的图片在线编辑,适合做快速应用嵌入
  • Halcon 2D测量Metrology找线/圆/矩形/椭圆
  • Gorilla Mk1机器人:CubeMars电机加持,助力高空作业新突破
  • 3259. 超级饮料的最大强化能量
  • 【AI人工智能】给GPT一个英文文档,让它进行翻译,总结。
  • linux图形化X窗口
  • 商品详情API接口系列(json数据示例演示)
  • Lucene的使用方法与Luke工具(2)
  • 基于redis实现延迟队列
  • 【Docker项目实战】使用Docker安装Blossom 笔记应用
  • 【LangChain系列4】【Chain模块详解】
  • 【2025最新整理】ResNet 系列网络的演进及其创新
  • lanqiaoOJ 3255:重新排队 ← STL list 单链表
  • 【贪心算法】(第十三篇)
  • Linux---cp命令
  • 【p2p、分布式,区块链笔记 Torrent】WebTorrent 的lt_donthave插件
  • 软件测试学习笔记丨Flask操作数据库-数据库和表的管理
  • MySQL utf8mb3 和 utf8mb4引发的问题
  • 前端八股文第七篇
  • .net core NPOI以及NOPI mapper
  • HTML的总结作业
  • 简单的kafkaredis学习之kafka