第58题输入输出系列6-压缩文件相关技术1
Posted 小虚竹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第58题输入输出系列6-压缩文件相关技术1相关的知识,希望对你有一定的参考价值。
回城传送–》《JAVA筑基100例》
文章目录
零、前言
今天是学习 JAVA语言 打卡的第58天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。
因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
一、题目描述-压缩文本文件
1、题目
题目:使用文本压缩技术,可以节约磁盘空间,还便于管理。
实现:做一个压缩指定文件夹内的所有文本文件的工具。
2、解题思路
创建一个类:ZipTextFileFrame
使用ZipTextFileFrame继承JFrame构建窗体
压缩文件主要用到压缩输出流ZipOutputStream
以zip文件格式写入文件实现输出流过滤器。
每一个文件在压缩过程中会被存到zipEntry
使用putNextEntry()方法,增加zipEntry
压缩文件会放在选择文件夹的同级目录,并以java.zip命名。
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.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
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.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 ZipTextFileFrame extends JFrame
/**
*
*/
private static final long serialVersionUID = -8885017327239429018L;
private JPanel contentPane;
private JTextField chooseTextField;
private JTable table;
private File[] textFiles;
/**
* Launch the application.
*/
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
public void run()
try
ZipTextFileFrame frame = new ZipTextFileFrame();
frame.setVisible(true);
catch (Exception e)
e.printStackTrace();
);
/**
* Create the frame.
*/
public ZipTextFileFrame()
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 zipButton = new JButton("开始压缩");
zipButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent arg0)
do_zipButton_actionPerformed(arg0);
);
buttonPanel.add(zipButton);
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.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setMultiSelectionEnabled(false);
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION)
File selectFile = fileChooser.getSelectedFile();
chooseTextField.setText(selectFile.getAbsolutePath());
textFiles = selectFile.listFiles(new FileFilter()
@Override
public boolean accept(File file)
if (file.getPath().endsWith(".txt"))
return true;
return false;
);
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setColumnIdentifiers(new Object[] "序号", "文件名" );
for (int i = 0; i < textFiles.length; i++)
model.addRow(new Object[] i + 1, textFiles[i].getName() );
table.setModel(model);
protected void do_zipButton_actionPerformed(ActionEvent arg0)
if (chooseTextField.getText().length() == 0)
JOptionPane.showMessageDialog(this, "请选择要压缩的文件夹", "", JOptionPane.WARNING_MESSAGE);
return;
String zipFilePath = new File(chooseTextField.getText()).getParent();
try
zipFile(textFiles, new File(zipFilePath + File.separator + "java.zip"));
JOptionPane.showMessageDialog(this, "完成压缩");
catch (IOException e)
e.printStackTrace();
private static void zipFile(File[] files, File targetZipFile) throws IOException
// 利用给定的targetZipFile对象创建文件输出流对象
FileOutputStream fos = new FileOutputStream(targetZipFile);
ZipOutputStream zos = new ZipOutputStream(fos);// 利用文件输出流创建压缩输出流
byte[] buffer = new byte[1024];// 创建写入压缩文件的数组
for (File file : files) // 遍历全部文件
ZipEntry entry = new ZipEntry(file.getName());// 利用每个文件的名字创建ZipEntry对象
FileInputStream fis = new FileInputStream(file);// 利用每个文件创建文件输入流对象
zos.putNextEntry(entry);// 在压缩文件中添加一个ZipEntry对象
int read = 0;
while ((read = fis.read(buffer)) != -1)
zos.write(buffer, 0, read);// 将输入写入到压缩文件
zos.closeEntry();// 关闭ZipEntry
fis.close();// 释放资源
zos.close();
fos.close();
压缩成功:
查看压缩结果:
二、题目描述-压缩文件解压到指定文件夹
1、题目
题目:实现一个压缩文件解压到指定文件夹的工具
2、解题思路
创建一个类:UnZipTextFileFrame
先获取一个zip格式的压缩文件
再指定要解压缩存放的文件夹
使用JAVA自带的压缩工具包来实现解压缩功能
利用用户选择的ZIP文件创建ZipFile对象
遍历ZipFile对象的枚举变量, 获得ZipEntry对象
获得的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.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
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 UnZipTextFileFrame extends JFrame
/**
*
*/
private static final long serialVersionUID = -7525621255251725313L;
private JPanel contentPane;
private JTextField sourceTextField;
private JTable table;
private File zipFile;
private JTextField targetTextField;
private File targetFile;
/**
* Launch the application.
*/
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
public void run()
try
UnZipTextFileFrame frame = new UnZipTextFileFrame();
frame.setVisible(true);
catch (Exception e)
e.printStackTrace();
);
/**
* Create the frame.
*/
public UnZipTextFileFrame()
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);
sourceTextField = new JTextField();
choosePanel.add(sourceTextField);
sourceTextField.setColumns(10);
JButton sourceButton = new JButton("Zip文件");
sourceButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent arg0)
do_sourceButton_actionPerformed(arg0);
);
choosePanel.add(sourceButton);
targetTextField = new JTextField();
choosePanel.add(targetTextField);
targetTextField.setColumns(10);
JButton targetButton = new JButton("解压到");
targetButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent arg0)
do_targetButton_actionPerformed(arg0);
);
choosePanel.add(targetButton);
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_sourceButton_actionPerformed(ActionEvent arg0)
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter<以上是关于第58题输入输出系列6-压缩文件相关技术1的主要内容,如果未能解决你的问题,请参考以下文章