[Java]Swing窗体演示ZIP压缩流的压缩与解压
最近开始学习java,然后学完了Swing和各种流后,试着写了个ZIP的压缩解压软件出来,具体代码如下:
压缩准备部分:
String path = ja.getText();//获取文本域内容String dst;//存储目标zip的绝对路径File f = new File(path);//源文件的File对象ZipOutputStream zs;//目标zip文件的ZipOutputStream对象if(path.isEmpty()){//确定有内容JOptionPane.showMessageDialog(null, "文本框内没有路径!");return;}if(!path.matches("[a-zA-Z]:([/\\\\][^/:*?\"<>|\\\\]+)*")){//确认路径合法JOptionPane.showMessageDialog(null, path+" 不符合格式!");return;}else if(!f.exists()){//确认文件存在与否JOptionPane.showMessageDialog(null, path+" 不存在!");return;}//这里在根据文件名字生成压缩文件的名字if(f.isDirectory())dst = path + ".zip";else dst = path.substring(0,path.lastIndexOf('.'))+".zip";try {zs = new ZipOutputStream(new FileOutputStream(dst));//获取压缩文件输出流zip(zs,f,f.getName());//开始压缩zs.close();//关闭压缩文件输出流} catch (IOException fileNotFoundException) {fileNotFoundException.printStackTrace();}JOptionPane.showMessageDialog(null, "压缩成功!");
压缩部分:
private static void zip(ZipOutputStream zo,File f,String base) throws IOException {if(f.isDirectory()){//是否为一个文件夹File[] fl = f.listFiles();//获得文件夹下的所有文件//System.out.println(base+"/");zo.putNextEntry(new ZipEntry(base + "/"));//写入该目录的entry,即在压缩文件中创建该文件夹for(int i=0;i<fl.length;++i)//向下检索zip(zo,fl[i],base+"/"+fl[i].getName());}else{//若是文件zo.putNextEntry(new ZipEntry(base));//在压缩文件中创建该文件FileInputStream in=new FileInputStream(f);//准备读取文件到压缩文件int b;//System.out.println(base);while((b=in.read())!=-1)//读取中...zo.write(b);in.close();}}
解压部分:
String path = ja.getText();
File f = new File(path);//源文件的File对象
if(path.isEmpty()){JOptionPane.showMessageDialog(null, "文本框内没有路径!");return;
}
if(!path.matches("[a-zA-Z]:([/\\\\][^/:*?\"<>|\\\\]+)*.zip")){//确认路径合法JOptionPane.showMessageDialog(null, path+" 不符合格式!");return;
}else if(!f.exists()){//确认文件存在与否JOptionPane.showMessageDialog(null, path+" 不存在!");return;
}
try {ZipInputStream zi = new ZipInputStream(new FileInputStream(path));//获取压缩文件输入流ZipEntry entry;path = path.substring(0,path.lastIndexOf('.'));//去掉.zip以获取目标文件夹路径while((entry=zi.getNextEntry())!=null){//遍历entryFile file = new File(path+"\\"+entry.getName());//准备输出到该目标文件/文件夹if(!file.exists()){//若文件不存在(如果文件已经存在就不会覆盖)if(entry.isDirectory())//要么创建文件夹file.mkdirs();else{//要么创建文件并通过流解压到文件file.createNewFile();FileOutputStream fo = new FileOutputStream(file);int len;byte[] buf = new byte[1024];while ((len = zi.read(buf)) != -1) {fo.write(buf, 0, len);}fo.close();}}zi.closeEntry();//System.out.println(entry.getName()+" 解压成功到 "+path+"\\"+entry.getName());}zi.close();JOptionPane.showMessageDialog(null, path+" 解压成功!");
} catch (IOException fileNotFoundException) {fileNotFoundException.printStackTrace();
}
完全程序代码:
package com.company;//如果你用的是默认包就删了这个,否则就改成你的包名import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.zip.*;public class Main extends JFrame {//这里是主类,继承了JFrameprivate static void creatWindow(){try {//更改窗口风格为win7风格UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch (ClassNotFoundException | InstantiationException | IllegalAccessException| UnsupportedLookAndFeelException e) {e.printStackTrace();}JFrame window = new JFrame("压缩解压软件");//创建窗体window.setBounds(200,200,600,300);//确认大小window.setBackground(Color.white);//背景颜色设置window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭模式设置Container container = window.getContentPane();//获得容器window.setLayout(null);//设置为绝对布局JLabel jl = new JLabel("请输入要压缩或解压的文件或文件夹路径:");//设置文字jl.setBounds(10,10,300,20);JTextArea ja = new JTextArea();//设置文本域ja.setBounds(10,31,560,150);container.add(jl);container.add(ja);JButton jb1 = new JButton("压缩");//设置按钮JButton jb2 = new JButton("解压");JButton jb3 = new JButton("退出");jb1.setBounds((600 / 3 - 100) / 2,31+150+10,100,40);jb2.setBounds((600/3-100)/2+ 100 + (600 / 3 - 100),31+150+10,100,40);jb3.setBounds((600/3-100)/2+100*2+(600/3-100)*2,31+150+10,100,40);jb1.addActionListener(new AbstractAction() {//压缩按钮点击public void actionPerformed(ActionEvent e) {//压缩String path = ja.getText();//获取文本域内容String dst;//存储目标zip的绝对路径File f = new File(path);//源文件的File对象ZipOutputStream zs;//目标zip文件的ZipOutputStream对象if(path.isEmpty()){//确定有内容JOptionPane.showMessageDialog(null, "文本框内没有路径!");return;}if(!path.matches("[a-zA-Z]:([/\\\\][^/:*?\"<>|\\\\]+)*")){//确认路径合法JOptionPane.showMessageDialog(null, path+" 不符合格式!");return;}else if(!f.exists()){//确认文件存在与否JOptionPane.showMessageDialog(null, path+" 不存在!");return;}//这里在根据文件名字生成压缩文件的名字if(f.isDirectory())dst = path + ".zip";else dst = path.substring(0,path.lastIndexOf('.'))+".zip";try {zs = new ZipOutputStream(new FileOutputStream(dst));//获取压缩文件输出流zip(zs,f,f.getName());//开始压缩zs.close();//关闭压缩文件输出流} catch (IOException fileNotFoundException) {fileNotFoundException.printStackTrace();}JOptionPane.showMessageDialog(null, "压缩成功!");}});jb2.addActionListener(new AbstractAction() {//解压按钮点击public void actionPerformed(ActionEvent e) {//解压String path = ja.getText();File f = new File(path);//源文件的File对象if(path.isEmpty()){JOptionPane.showMessageDialog(null, "文本框内没有路径!");return;}if(!path.matches("[a-zA-Z]:([/\\\\][^/:*?\"<>|\\\\]+)*.zip")){//确认路径合法JOptionPane.showMessageDialog(null, path+" 不符合格式!");return;}else if(!f.exists()){//确认文件存在与否JOptionPane.showMessageDialog(null, path+" 不存在!");return;}try {ZipInputStream zi = new ZipInputStream(new FileInputStream(path));//获取压缩文件输入流ZipEntry entry;path = path.substring(0,path.lastIndexOf('.'));//去掉.zip以获取目标文件夹路径while((entry=zi.getNextEntry())!=null){//遍历entryFile file = new File(path+"\\"+entry.getName());//准备输出到该目标文件/文件夹if(!file.exists()){//若文件不存在(如果文件已经存在就不会覆盖)if(entry.isDirectory())//要么创建文件夹file.mkdirs();else{//要么创建文件并通过流解压到文件file.createNewFile();FileOutputStream fo = new FileOutputStream(file);int len;byte[] buf = new byte[1024];while ((len = zi.read(buf)) != -1) {fo.write(buf, 0, len);}fo.close();}}zi.closeEntry();//System.out.println(entry.getName()+" 解压成功到 "+path+"\\"+entry.getName());}zi.close();JOptionPane.showMessageDialog(null, path+" 解压成功!");} catch (IOException fileNotFoundException) {fileNotFoundException.printStackTrace();}}});jb3.addActionListener(new AbstractAction() {//退出按钮点击public void actionPerformed(ActionEvent e) {//退出System.exit(0);}});container.add(jb1);container.add(jb2);container.add(jb3);window.setVisible(true);}private static void zip(ZipOutputStream zo,File f,String base) throws IOException {if(f.isDirectory()){//是否为一个文件夹File[] fl = f.listFiles();//获得文件夹下的所有文件//System.out.println(base+"/");zo.putNextEntry(new ZipEntry(base + "/"));//写入该目录的entry,即在压缩文件中创建该文件夹for(int i=0;i<fl.length;++i)//向下检索zip(zo,fl[i],base+"/"+fl[i].getName());}else{//若是文件zo.putNextEntry(new ZipEntry(base));//在压缩文件中创建该文件FileInputStream in=new FileInputStream(f);//准备读取文件到压缩文件int b;//System.out.println(base);while((b=in.read())!=-1)//读取中...zo.write(b);in.close();}}public static void main(String[] args) throws IOException {creatWindow();}
}
效果:
看看里面:
虽然有两个文件夹变成了文件的样子,而且我也不知道什么,但是不影响我们解压回正确的样子!
可见里面的数据没有受到影响:
以上,展示完毕。
[Java]Swing窗体演示ZIP压缩流的压缩与解压相关推荐
- ZIP 也能边下载边解压?流式解压技术揭秘!
对于一个 ZIP 文件,由于标准的解压方式总是从读取文件的末尾开始的,因此必须下载完整个 ZIP 解压后才能访问.当用户通过网络访问 ZIP 文件时,下载解压所带来的耗时将大大降低用户体验.那么能不能 ...
- Java解压上传zip或rar文件,并解压遍历文件中的html的路径
1.本文只提供了一个功能的代码 public String addFreeMarker() throws Exception {HttpSession session = request.getSes ...
- vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)
vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩) DLL:Ionic.Zip.dll 说明: 1.解压/压缩 显示加密进度及总进度. 2.zip文件打开,浏览内部文件. ...
- linux一次压缩多个文件,同时解压多个zip文件
1. 查看所有文件: [root@localhost ebsupdate]# ls 3262919_ZHS 4607647_ZHS 7429271_ZHS p420679 ...
- 工具——Windows下后缀为.zip.001的分卷文件的解压方法
Windows下后缀为.zip.001的分卷文件的解压方法 在Windows下,后缀为*.zip.001的分卷打包文件使用winrar无法解压时. 解决办法是首先将分卷打包的文件整合为一个文件包,然后 ...
- java 压缩jar_Java基础之实现解压和压缩jar、zip、rar等源码分享
有的时候在修改服务器项目中jar包配置时比较费事,相信开发过一定时间的码农们都遇到过类似的问题吧,需要重新打包再上传替换jar包,这样相对比较费事还有可能导致多人修改jar包导致不同步从而系统异常.下 ...
- Java Swing窗体编写——窗口创建思想
目录 Java Swing 1.常见组件的介绍 1.1.相关内容 1.2.创建思想 2.总结 Java Swing 1.常见组件的介绍 JFrame.JPanel.JLabel.JTextArea.J ...
- java压缩文件太慢_java 解压6万个ZIP文件,如何提升速度?
目前我使用的是org.apache.tools.zipjar包解压5015个zip文件,解压后14344个文件,耗时:669493毫秒代码:****************************** ...
- java 前后端解压缩字符串_接口实现后台GZIP压缩,pako.js 前端解压
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...
最新文章
- 07 分支管理 —— Feature分支
- stl 之 copy copy_backward
- VS2015中DataGridView的DataGridViewComBoboxCell列值无效及数据绑定错误的解决方法
- mvc怎么请求服务器错误信息,asp.net-mvc – IIS显示服务器错误而不是自定义错误...
- 五年一贯制专转本计算机网络真题,金陵科技学院2017年五年一贯制专转本考试大纲(计算机网络基础)...
- oracle实现id自增和设置主键
- 在mac上安装python版的hanlp/JPype1
- solr.Net课程二 solr5.5之core配置
- poj 1833 排列
- 全国计算机演示文稿,全国计算机等级考试二级office演示文稿题目[文].pdf
- 28个极简代码——python
- android中svn合并分支,Android Studio之SVN打分支、切换分支及合并分支
- 【区块链】开源社区发力区块链,超级账本会成就Linux一样的传奇吗?
- 【AD-NeRF】音频驱动人脸NeRF
- 深度探索C++对象模型pdf
- 网络安全!顶级大佬进行鱼叉式钓鱼攻击?手把手教学
- 疫情面试了13家企业软件测试岗位,面试题整理汇总,真的牛
- 计算机多媒体设备是啥,什么是多媒体教学设备?多媒体教学设备有哪些??
- Android进阶——Android控制端连接同一网段Wi-Fi家用打印机小结
- JAVA 开发统一规范(规约)