【第59题】输入、输出系列7-压缩文件相关技术2
回城传送–》《JAVA筑基100例》
零、前言
今天是学习 JAVA语言 打卡的第59天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。
因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
一、题目描述-多层文件夹压缩包的释放
题目:做一个多层文件夹压缩包的释放的工具。
二、解题思路
创建一个类:UnZipDirectoryFrame
使用UnZipDirectoryFrame继承JFrame构建窗体
压缩包内会有多个文件夹,每个文件夹可能会有文件夹或是文件,为了解压缩时能还原出文件夹的层次关系。
解压缩包含子文件夹的文件夹方案和解压缩全是文件的文件夹类似,区别在于如何找出包含子文件夹的文件夹的所有文件,并且构造ZipEntry时,不要有重名的情况。
三、代码详解
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
解压缩成功:
四、推荐专栏
《Hutool实战》7hutool实战:FileUtil 文件工具类(100多个文件常用操作方法)
五、示例源码下载
关注下面的公众号,回复筑基+题目号
筑基59
文章来源: xiaoxuzhu.blog.csdn.net,作者:小虚竹,版权归原作者所有,如需转载,请联系作者。
原文链接:xiaoxuzhu.blog.csdn.net/article/details/124772724
- 点赞
- 收藏
- 关注作者
评论(0)