首頁 > 軟體

Java實現讀取Jar檔案屬性的方法詳解

2022-08-09 22:02:19

一、題目描述-讀取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檔案屬性的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com