首頁 > 軟體

Java實現多層資料夾壓縮功能

2022-08-12 22:01:40

壓縮檔案相關技術

1.題目

做一個多層資料夾壓縮包的釋放的工具。

2.解題思路

建立一個類:UnZipDirectoryFrame

使用UnZipDirectoryFrame繼承JFrame構建表單

壓縮包內會有多個資料夾,每個資料夾可能會有資料夾或是檔案,為了解壓縮時能還原出資料夾的層次關係。

解壓縮包含子資料夾的資料夾方案和解壓縮全是檔案的資料夾類似,區別在於如何找出包含子資料夾的資料夾的所有檔案,並且構造ZipEntry時,不要有重名的情況。

3.程式碼詳解

package com.xiaoxuzhu;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
/**
 * Description: 多層資料夾壓縮包的釋放
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改記錄:
 * 修改後版本	        修改人		修改日期			修改內容
 * 2022/5/4.1	    xiaoxuzhu		2022/5/4		    Create
 * </pre>
 * @date 2022/5/4
 */

public class UnZipDirectoryFrame extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 7178478435446172846L;
    private JPanel contentPane;
    private JTextField chooseTextField;
    private JTable table;
    private File zipFile;

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

    /**
     * Create the frame.
     */
    public UnZipDirectoryFrame() {
        setTitle("多層資料夾壓縮包的釋放");
        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(new BorderLayout(0, 0));

        JPanel choosePanel = new JPanel();
        contentPane.add(choosePanel, BorderLayout.NORTH);

        chooseTextField = new JTextField();
        choosePanel.add(chooseTextField);
        chooseTextField.setColumns(18);

        JButton chooseButton = new JButton("選擇壓縮檔案");
        chooseButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                do_chooseButton_actionPerformed(arg0);
            }
        });
        choosePanel.add(chooseButton);

        JPanel buttonPanel = new JPanel();
        contentPane.add(buttonPanel, BorderLayout.SOUTH);

        JButton unzipButton = new JButton("開始解壓縮");
        unzipButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                do_unzipButton_actionPerformed(arg0);
            }
        });
        buttonPanel.add(unzipButton);

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

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

    protected void do_chooseButton_actionPerformed(ActionEvent arg0) {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter("文字檔案", "zip"));
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int result = fileChooser.showOpenDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {
            zipFile = fileChooser.getSelectedFile();
            chooseTextField.setText(zipFile.getAbsolutePath());
        }
    }

    protected void do_unzipButton_actionPerformed(ActionEvent arg0) {
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setColumnIdentifiers(new Object[] { "序號", "檔名" });
        List<String> list = new ArrayList<String>();
        try {
            unzip(zipFile, list);
            for (int i = 0; i < list.size(); i++) {
                model.addRow(new Object[] { i + 1, list.get(i) });
            }
            table.setModel(model);
            JOptionPane.showMessageDialog(this, "解壓縮完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void unzip(File zipFile, List<String> list) throws IOException {
        // 利用使用者選擇的ZIP檔案建立ZipInputStream物件
        ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile));
        ZipEntry entry;
        while ((entry = in.getNextEntry()) != null) {// 遍歷所有ZipEntry物件
            if (!entry.isDirectory()) {// 如果是檔案則建立並寫入
                File tempFile = new File(zipFile.getParent() + File.separator + entry.getName());
                list.add(tempFile.getName());// 增加檔名
                new File(tempFile.getParent()).mkdirs();// 建立資料夾
                tempFile.createNewFile();// 建立新檔案
                FileOutputStream out = new FileOutputStream(tempFile);
                int b;
                while ((b = in.read()) != -1) {// 寫入資料
                    out.write(b);
                }
                out.close();// 釋放資源
            }
        }
        in.close();
    }
}

解壓縮成功:

到此這篇關於Java實現多層資料夾壓縮功能的文章就介紹到這了,更多相關Java資料夾壓縮內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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