⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.java

📁 哈夫曼编码 文件压缩 使用java语言对文件进行编码压缩
💻 JAVA
字号:
package hfmCompress;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.FileDialog;
import javax.swing.border.BevelBorder;

public class Main extends JFrame implements ActionListener, Runnable {
	private final int WIDTH = 400, HEIGHT = 200;

	private Toolkit kit = null;

	private int screenWidth = 0, screenHeight = 0;

	private Dimension screenSize = null;

	private JLabel[] compressLabel = new JLabel[4];

	private JTextField[] compressTextField = new JTextField[4];

	private JButton[] compressButton = new JButton[4];

	private JButton startButton = new JButton("确定");

	private JButton resetButton = new JButton("重置");

	private JButton quitButton = new JButton("退出");

	private String[] labelText = { "压缩文件: ", "压缩路径:", "解压文件:", "解压路径:" };

	private Font f = new Font("", Font.BOLD, 15);

	private static Main mainWindow = null;

	private boolean compress = true;

	private Compress compressFile = null, deCompressFile = null;

	private String sourceFolderName = null, destinationFolderName = null,
			sFileName = null, dFileName = null;

	private static Process compressProcess = null, deCompressProcess = null;

	public Main() {
		super("数据结构实验二——文件压缩");
		this.setSize(WIDTH, HEIGHT);
		kit = Toolkit.getDefaultToolkit();
		screenSize = kit.getScreenSize();
		screenWidth = screenSize.width;
		screenHeight = screenSize.height;
		setLocation((screenWidth - WIDTH) / 2,
						(screenHeight - HEIGHT) / 2);
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent event) {
				if (JOptionPane.showConfirmDialog(null, "是否真的要退出?", "文件压缩",
						JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
					System.exit(0);
				}
			}
		});

		Container content = this.getContentPane();
		content.setLayout(new FlowLayout());
		for (int i = 0; i < 4; i++) {
			compressLabel[i] = new JLabel(labelText[i]);
			compressLabel[i].setFont(f);
			compressLabel[i].setForeground(Color.CYAN.darker());
			compressTextField[i] = new JTextField(20);
			compressTextField[i].setFont(f);
			compressButton[i] = new JButton("浏览");
			compressButton[i].setFont(f);
			compressButton[i].setForeground(Color.BLUE);
			compressButton[i].setBorder(new BevelBorder(BevelBorder.RAISED));
			compressButton[i].addActionListener(this);
			compressButton[i].addMouseListener(new MouseWatcher());
			content.add(compressLabel[i]);
			content.add(compressTextField[i]);
			content.add(compressButton[i]);
			if (i % 2 == 1) {
				compressTextField[i].setEditable(false);
				compressButton[i].setEnabled(false);
			}
		}
		startButton.setFont(f);
		startButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		startButton.addActionListener(this);
		startButton.addMouseListener(new MouseWatcher());
		startButton.setEnabled(false);
		resetButton.setFont(f);
		resetButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		resetButton.addActionListener(this);
		resetButton.addMouseListener(new MouseWatcher());
		quitButton.setFont(f);
		quitButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		quitButton.addActionListener(this);
		quitButton.addMouseListener(new MouseWatcher());
		content.add(startButton);
		content.add(resetButton);
		content.add(quitButton);
		content.setBackground(Color.BLACK);
		this.setResizable(false);
	}

	public void actionPerformed(ActionEvent ae) {
		if (!(ae.getSource() instanceof JButton)) {
			return;
		}
		JButton jb = (JButton) ae.getSource();
		if (jb == compressButton[0] || jb == compressButton[2]) {
			FileDialog fileChooser = new FileDialog(mainWindow, "选择压缩文件",
					FileDialog.LOAD);
			fileChooser.setVisible(true);
			sFileName = fileChooser.getFile();
			sourceFolderName = fileChooser.getDirectory();
			if (sFileName == null || sourceFolderName == null) {
				return;
			}
			if (jb == compressButton[0]) {
				compress = true;
				compressButton[1].setEnabled(true);
				compressTextField[1].setEditable(true);
				compressButton[2].setEnabled(false);
				compressTextField[2].setEditable(false);
				compressTextField[0].setText(sourceFolderName + sFileName);
			} else {
				compress = false;
				compressButton[0].setEnabled(false);
				compressTextField[0].setEditable(false);
				compressButton[3].setEnabled(true);
				compressTextField[3].setEditable(true);
				compressTextField[2].setText(sourceFolderName + sFileName);
			}
		} else if (jb == compressButton[1] || jb == compressButton[3]) {
			FileDialog fileSaver = new FileDialog(mainWindow, "选择文件路径",
					FileDialog.SAVE);
			fileSaver.setVisible(true);
			if (dFileName == null || destinationFolderName == null) {
				return;
			}
			if (jb == compressButton[1]) {
				compressTextField[1].setEditable(true);
				compressTextField[1].setText(destinationFolderName + dFileName);
			} else {
				compressTextField[3].setEditable(true);
				compressTextField[3].setText(destinationFolderName + dFileName);
			}
			startButton.setEnabled(true);
	} else if (jb == startButton) {
			if (compress) {
				compressProcess = new Process();
				compressProcess.setVisible(true);
				compressProcess.setTitle("正在压缩……");
				Thread processThread = new Thread(compressProcess);
				processThread.start();
				Thread mainThread = new Thread(this);
				mainThread.start();
			} else {				
				deCompressProcess = new Process();				
				deCompressProcess.setTitle("正在解压……");
				Thread processThread = new Thread(deCompressProcess);
				processThread.start();
				Thread mainThread = new Thread(this);
				mainThread.start();
			}
			startButton.setEnabled(false);
		} else if (jb == resetButton) {
			compressTextField[0].setEditable(true);
			compressButton[0].setEnabled(true);
			compressTextField[0].setText("");
			compressTextField[1].setEditable(false);
			compressButton[1].setEnabled(false);
			compressTextField[1].setText("");
			compressTextField[2].setEditable(true);
			compressButton[2].setEnabled(true);
			compressTextField[2].setText("");
			compressTextField[3].setEditable(false);
			compressButton[3].setEnabled(false);
			compressTextField[3].setText("");
		} else if (jb == quitButton) {
			if (JOptionPane.showConfirmDialog(null, "是否真的要退出?", "文件压缩",
					JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
				System.exit(0);
			}
		}
	}
	public static void showProcess(){
		deCompressProcess.setVisible(true);
	}

	public void run() {
		try {
			if (compress) {
				compressFile = new Compress();	
				
					Thread.sleep(100);
				compressFile.readAndSort(sourceFolderName + sFileName);
				Process.setCompressTrue(15,"正在创建最小堆……");
				Thread.sleep(200);
				compressFile.creatMinHeap();
				Process.setCompressTrue(20,"正在获得字节编码……");
				Thread.sleep(200);
				compressFile.calBytesAndLastBits();
				Process.setCompressTrue(25,"正在创建压缩文件……");
				Thread.sleep(200);
				compressFile.writeCode(destinationFolderName, dFileName,
						sourceFolderName, sFileName);
				Process.setCompressTrue(100,"正在结束压缩……");
				Thread.sleep(200);				
				compressProcess.dispose();
				JOptionPane.showMessageDialog(null, "^_^ 压缩完毕!", "文件压缩",
						JOptionPane.INFORMATION_MESSAGE);
			} else {
				deCompressFile = new Compress();
				deCompressFile.deCompress(destinationFolderName, dFileName,
						sourceFolderName, sFileName);	
				Process.setCompressTrue(100,"正在结束解压……");
				Thread.sleep(200);
				deCompressProcess.dispose();
				JOptionPane.showMessageDialog(null, "^_^ 解压完毕!", "文件压缩",
						JOptionPane.INFORMATION_MESSAGE);
			}
		} catch (Exception a) {

		}
	}

	private class MouseWatcher extends MouseAdapter {
		public void mousePressed(MouseEvent me) {
			((JButton) me.getSource()).setBorder(new BevelBorder(
					BevelBorder.LOWERED));
		}

		public void mouseReleased(MouseEvent me) {
			((JButton) me.getSource()).setBorder(new BevelBorder(
					BevelBorder.RAISED));
		}
	}

	public static void main(String[] args) {
		mainWindow = new Main();
		mainWindow.setVisible(true);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -