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

目录
  • 一、题目描述-读取Jar文件属性
    • 1、题目
    • 2、解题思路
    • 3、代码详解

一、题目描述-读取Jar文件属性

1、题目

做一个读取jar文件的内容和功能的工具。

2、解题思路

创建一个类:ReaderJarFrame

使用ReaderJarFrame继承JFrame构建窗体

在选择jar后,窗体的表格会显示其内容。

创建一个类:ReadJar

ReadJar类实现读取功能

读取的逻辑:使用JarFile类与Enumeration接口。

jarFile是Java提供的一个类,可以读取jar包中的所有文件(递归读取),然后提取指定的文件。

JarFile.entries()可以得到一个jar文件内部元素的迭代器(Enumeration)。同过这个迭代器我们可以获得所有的JarEntry

3、代码详解

ReaderJarFrame类

package com.xiaoxuzhu;
import java.awt.EventQueue;
import java.awt.FileDialog;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.List;

import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class ReaderJarFrame extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 7776474232093298420L;
    private JPanel contentPane;
    private JTextField pathTextField;
    private JTable table;
    private LocalTableModel model = new LocalTableModel();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    ReaderJarFrame frame = new ReaderJarFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ReaderJarFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        setTitle("获取Jar文件的文件属性");
        JPanel panel = new JPanel();
        panel.setBounds(0, 0, 434, 262);
        contentPane.add(panel);
        panel.setLayout(null);

        JLabel messageLabel = new JLabel("文件:");
        messageLabel.setBounds(39, 25, 41, 15);
        panel.add(messageLabel);

        pathTextField = new JTextField();
        pathTextField.setBounds(90, 22, 185, 21);
        panel.add(pathTextField);
        pathTextField.setColumns(10);

        JButton button = new JButton("选择");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                do_button_actionPerformed(arg0);
            }
        });
        button.setBounds(305, 21, 79, 23);
        panel.add(button);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(30, 77, 372, 152);
        panel.add(scrollPane);

        table = new JTable(model);
        scrollPane.setViewportView(table);
    }

    // 打开按钮的单击事件
    @SuppressWarnings("rawtypes")
    protected void do_button_actionPerformed(ActionEvent arg0) {
        java.awt.FileDialog fd = new FileDialog(this);
        fd.setVisible(true);
        String path = fd.getDirectory() + fd.getFile();
        if (path.endsWith(".jar")) {
            pathTextField.setText(path);
            List list = ReadJar.process(path);
            for (int i = 0; i < list.size(); i++) {
                FileName fileName = (FileName) list.get(i);
                model.addRow(new Object[] { fileName.getName(), fileName.getSize() });
            }

        }

    }
}

FileName类

package com.xiaoxuzhu;

/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class FileName {
    private String name;
    private String size;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

}

LocalTableModel类:

package com.xiaoxuzhu;

import javax.swing.table.DefaultTableModel;

/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class LocalTableModel extends DefaultTableModel {
    /**
     *
     */
    private static final long serialVersionUID = 8746141681804141757L;
    Class<?>[] types = new Class[] { java.lang.Object.class, java.lang.String.class };
    boolean[] canEdit = new boolean[] { false, false };

    public LocalTableModel() {
        super(new Object[][] {}, new String[] { "文件", "大小" });
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return types[columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit[columnIndex];
    }
}

ReadJar类:

package com.xiaoxuzhu;

import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class ReadJar {

    @SuppressWarnings("rawtypes")
    static List<FileName> process(String fileName) {
        List<FileName> list = new ArrayList<FileName>(); // 创建List集合对象
        try {
            JarFile jarFile = new JarFile(fileName); // 创建JarFile对象
            Enumeration en = jarFile.entries();
            while (en.hasMoreElements()) { // 测试枚举中是否包含更多的元素
                FileName file = new FileName(); // 定义JavaBean对象
                JarEntry entry = (JarEntry) en.nextElement(); // 获取集合中的元素
                String name = entry.getName(); // 获取文件名称
                long size = entry.getSize(); // 获取文件大小
                file.setName(name);
                file.setSize(size + "");
                list.add(file); // 将对象添加到集合中
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}

读取结果:

以上就是Java实现读取Jar文件属性的方法详解的详细内容,更多关于Java读取Jar文件属性的资料请关注我们其它相关文章!

(0)

相关推荐

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

    本文实例讲述了Java实现从jar包中读取指定文件的方法.分享给大家供大家参考,具体如下: 以下的Java代码实现了从一个jar包中读取指定文件的功能: /** * This class implements the funcationality of reading and writing files in jar files. */ package com.leo.util; import java.io.InputStream; import java.io.FileOutputStrea

  • 从Java的jar文件中读取数据的方法

    本文实例讲述了从Java的jar文件中读取数据的方法.分享给大家供大家参考.具体如下: Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR 文件格式支持压缩.身份验证和版本,以及许多其它特性. 从 JAR 文件中得到它所包含的文件内容是件棘手的事情,但也不是不可以做到.这篇技巧就将告诉你如何从 JAR 文件中取得一个文件.我们会先取得这个 JAR

  • 详解Java读取Jar中资源文件及示例代码

    详解Java读取Jar中资源文件及实现代码 直接上代码,文章的注释部分说的比较清楚,大家可以参考下, 工具类源代码: ResourceLoadFromJarUtil.java 实现代码: import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import

  • Java打包工具jar包详解

    Java打包工具是Java开发工具中比较常用的一种,代码重新打包工具jarjar可以帮助你将其它用到的java库打包并嵌入到你自己的项目jar包中.这样做的原因有: 当你发布项目的时候,把用到的库打包进现有项目jar包,可以让发布的这个jar包不比依赖于其它项目的jar包; 当你所用到的java库升级了以后,它所新发布的jar包可能和你现存的项目不匹配,为了保持项目的代码稳定性,你可以把编写代码时所用到的依赖jar包,全部打包进现在的项目jar包,以避免出现这个问题. jarjar可以通过Ant

  • Java以编程方式实现JAR文件的创建

    目录 Jar文件的解剖 创建一个 JarTool 类 JAR描述符 打开JAR文件进行编写 将文件添加到JAR中 一个工作实例 总结 大家好,我是指北君. 在这篇文章中,我们将介绍一下以编程方式创建jar文件的过程.在编写软件时,最终我们需要将其部署到生产状态.在某些情况下,使用带有独立文件的classpath是可以的.通常情况下,处理一个文件会更方便.在Java的情况下,标准的方法是使用JAR.WAR或EAR文件. 基本过程是编写清单,打开jar,添加内容,最后保存jar. Jar文件的解剖

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

    目录 一.题目描述-读取Jar文件属性 1.题目 2.解题思路 3.代码详解 一.题目描述-读取Jar文件属性 1.题目 做一个读取jar文件的内容和功能的工具. 2.解题思路 创建一个类:ReaderJarFrame 使用ReaderJarFrame继承JFrame构建窗体 在选择jar后,窗体的表格会显示其内容. 创建一个类:ReadJar ReadJar类实现读取功能 读取的逻辑:使用JarFile类与Enumeration接口. jarFile是Java提供的一个类,可以读取jar包中的

  • Java 读取外部资源的方法详解及实例代码

    Java 读取外部资源的方法详解 在Java代码中经常有读取外部资源的要求:如配置文件等等,通常会把配置文件放在classpath下或者在web项目中放在web-inf下. 1.从当前的工作目录中读取: try { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("wkdir.txt"))); String str; while ((str = in.readLine())

  • Spring Boot读取resources目录文件方法详解

    这篇文章主要介绍了Spring Boot读取resources目录文件方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java编码过程中,我们常常希望读取项目内的配置文件,按照Maven的习惯,这些文件一般放在项目的src/main/resources下,因此,合同协议PDF模板.Excel格式的统计报表等模板的存放位置是resources/template/test.pdf,下面提供两种读取方式,它们分别在windows和Linux

  • Java和C#输入输出流的方法(详解)

    1,Java中操作方法: import java.io.*; public class FileInputStreamTest { public static void main(String[] args) throws IOException { //创建字节输入流 FileInputStream fis = new FileInputStream("FileInputStreamTest.java"); //创建一个长度为1024的竹筒 byte[] bbuf = new byt

  • Java的JSON处理器fastjson使用方法详解

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发. 主要特点: • 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson) • 强大(支持普通JDK类包括任意Java Bean Class.Collection.Map.Date或enum) • 零依赖(没有依赖其它任何类库除了JDK) 示例代码: import com.alibaba.fastjson.JSON; Group group = new Group

  • 对python pandas读取剪贴板内容的方法详解

    我使用的Python3.5,32版本win764位系统,pandas0.19版本,使用df=pd.read_clipboard()的时候读不到数据,百度查找解决方法,找到了一个比较靠谱的 打开site-packages\pandas\io\clipboard.py 在 text = clipboard_get() 后面一行 加入这句: text = text.decode('UTF-8') 保存,然后就可以使用了 df=pd.read_clipboard() #变成正常的了 下次可以在其他地方复

  • 对pandas写入读取h5文件的方法详解

    1.引言 通过参考相关博客对hdf5格式简要介绍. hdf5在存储的是支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的. 使用压缩可以提磁盘利用率,节省空间. 开启压缩也没有什么劣势,只会慢一点点. 压缩在小数据量的时候优势不明显,数据量大了才有优势. 同时发现hdf读取文件的时候只能是一次写,写的时候可以append,可以put,但是写完成了之后关闭文件,就不能再写了, 会覆盖. 另外,为什么单独说pandas,主要因为本人目前对于h5py这个包的理解不是很深入,不

  • Java实现优雅的参数校验方法详解

    目录 一.引子 二.如何优雅地校验参数 2.1 官方指导意见 2.2 注解用法说明 一.引子 要对方法的参数进行校验,最简单暴力的写法是这个样子: public static void utilA(String a,BigDecimal b){ if (StringUtils.isEmpty(a)){ System.out.println("a不可为空"); return; } if (b == null){ System.out.println("b不可为空");

  • Java实现简易拼图游戏的方法详解

    目录 效果展示 游戏结构 实现代码 效果展示 介绍:游戏共有五张图片可以选择,分成了4 X 4 十六个方格,点击开始就可以开始游戏.游戏运行的截图如下: 游戏结构 实现代码 代码如下:MedleyGame.java类 package game.medleyPicture; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.even

  • Java通过反射注解赋值的方法详解

    目录 问题描述 最终解决 if/else 普通解法 通过反射注解赋值属性 解题思路 汇总某些字段的和 总结 源码 前段时间,领导分配一个统计销售区域汇总的数据,解决方案使用到了反射获取注解,通过注解获取属性或者设置字段属性. 问题描述 查询公司列表,分别是公司id.区域id.区域名称: 公司id 区域id 区域名称 1 1 华南 2 2 华北 3 2 华北 4 3 华东 5 3 华东 创建公司类Company: public class Company { public Company(Inte

随机推荐