最近开始学习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压缩流的压缩与解压相关推荐

  1. ZIP 也能边下载边解压?流式解压技术揭秘!

    对于一个 ZIP 文件,由于标准的解压方式总是从读取文件的末尾开始的,因此必须下载完整个 ZIP 解压后才能访问.当用户通过网络访问 ZIP 文件时,下载解压所带来的耗时将大大降低用户体验.那么能不能 ...

  2. Java解压上传zip或rar文件,并解压遍历文件中的html的路径

    1.本文只提供了一个功能的代码 public String addFreeMarker() throws Exception {HttpSession session = request.getSes ...

  3. vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)

    vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩) DLL:Ionic.Zip.dll 说明: 1.解压/压缩 显示加密进度及总进度. 2.zip文件打开,浏览内部文件. ...

  4. linux一次压缩多个文件,同时解压多个zip文件

    1. 查看所有文件: [root@localhost ebsupdate]# ls 3262919_ZHS  4607647_ZHS  7429271_ZHS              p420679 ...

  5. 工具——Windows下后缀为.zip.001的分卷文件的解压方法

    Windows下后缀为.zip.001的分卷文件的解压方法 在Windows下,后缀为*.zip.001的分卷打包文件使用winrar无法解压时. 解决办法是首先将分卷打包的文件整合为一个文件包,然后 ...

  6. java 压缩jar_Java基础之实现解压和压缩jar、zip、rar等源码分享

    有的时候在修改服务器项目中jar包配置时比较费事,相信开发过一定时间的码农们都遇到过类似的问题吧,需要重新打包再上传替换jar包,这样相对比较费事还有可能导致多人修改jar包导致不同步从而系统异常.下 ...

  7. Java Swing窗体编写——窗口创建思想

    目录 Java Swing 1.常见组件的介绍 1.1.相关内容 1.2.创建思想 2.总结 Java Swing 1.常见组件的介绍 JFrame.JPanel.JLabel.JTextArea.J ...

  8. java压缩文件太慢_java 解压6万个ZIP文件,如何提升速度?

    目前我使用的是org.apache.tools.zipjar包解压5015个zip文件,解压后14344个文件,耗时:669493毫秒代码:****************************** ...

  9. java 前后端解压缩字符串_接口实现后台GZIP压缩,pako.js 前端解压

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...

最新文章

  1. 07 分支管理 —— Feature分支
  2. stl 之 copy copy_backward
  3. VS2015中DataGridView的DataGridViewComBoboxCell列值无效及数据绑定错误的解决方法
  4. mvc怎么请求服务器错误信息,asp.net-mvc – IIS显示服务器错误而不是自定义错误...
  5. 五年一贯制专转本计算机网络真题,金陵科技学院2017年五年一贯制专转本考试大纲(计算机网络基础)...
  6. oracle实现id自增和设置主键
  7. 在mac上安装python版的hanlp/JPype1
  8. solr.Net课程二 solr5.5之core配置
  9. poj 1833 排列
  10. 全国计算机演示文稿,全国计算机等级考试二级office演示文稿题目[文].pdf
  11. 28个极简代码——python
  12. android中svn合并分支,Android Studio之SVN打分支、切换分支及合并分支
  13. 【区块链】开源社区发力区块链,超级账本会成就Linux一样的传奇吗?
  14. 【AD-NeRF】音频驱动人脸NeRF
  15. 深度探索C++对象模型pdf
  16. 网络安全!顶级大佬进行鱼叉式钓鱼攻击?手把手教学
  17. 疫情面试了13家企业软件测试岗位,面试题整理汇总,真的牛
  18. 计算机多媒体设备是啥,什么是多媒体教学设备?多媒体教学设备有哪些??
  19. Android进阶——Android控制端连接同一网段Wi-Fi家用打印机小结
  20. JAVA 开发统一规范(规约)

热门文章

  1. 【Luogu】 P3242 [HNOI2015] 接水果
  2. 一些关于GPS的论文和期刊
  3. 采用AMD VISION技术 试用Acer游戏本
  4. 【路径规划】基于matlab遗传优化模拟退火算法避障路径规划【含Matlab源码 889期】
  5. 笔记本电脑如何通过GPRS上网?
  6. 浙江大学求是科学班计算机,浙大校友网
  7. TCP/IP通俗易懂网络协议
  8. OpenCV直线检测(一)—— LSD
  9. 基于PHP+MYSQL的公司人事工资管理系统
  10. Windows的Os Loader恢复