Java 解压缩助手

简介:

我使用Java swing做了一个zip解压缩助手,界面如下:



使用的依赖包: 

 为什么不用java 自带的ZipUtil呢?因为 没有乱码问题.

技术问题

一,如何使窗口居中?

Java代码   收藏代码
  1. Dimension   screensize   =   Toolkit.getDefaultToolkit().getScreenSize();       
  2.      setSize(600280);       
  3.      Dimension   framesize   =   getSize();       
  4.      int   x   =   (int)screensize.getWidth()/2   -   (int)framesize.getWidth()/2;       
  5.      int   y   =   (int)screensize.getHeight()/2   -   (int)framesize.getHeight()/2;       
  6.      setLocation(x,y);     

 

 

 

二,增加助记键

效果:按Alt+C 时触发压缩按钮的点击事件,按Alt+D 触发解压按钮的单击事件

 

 

 三,全局快捷键

Java代码   收藏代码
  1. /*** 
  2.      * 设置全局快捷键,按Alt+r ,则命令输入框自动聚焦 
  3.      */  
  4.     private void globalShortcutKeys(){  
  5.         //Add global shortcuts  
  6.         Toolkit toolkit = Toolkit.getDefaultToolkit();  
  7.         // 注册应用程序全局键盘事件, 所有的键盘事件都会被此事件监听器处理.  
  8.         toolkit.addAWTEventListener(  
  9.                 new java.awt.event.AWTEventListener() {  
  10.                       
  11.   
  12.                     @Override  
  13.                     public void eventDispatched(AWTEvent event) {  
  14.                         if (event.getClass() == KeyEvent.class) {  
  15.                             KeyEvent kE = ((KeyEvent) event);  
  16.                             // 处理按键事件 Ctrl+Enter  
  17.                             if ((kE.getKeyCode() == KeyEvent.VK_R)  
  18.                                     && (((InputEvent) event)  
  19.                                             .isAltDown())&& kE.getID() == KeyEvent.KEY_PRESSED) {  
  20.                                 System.out.println("Alt+r");  
  21.                                 shScriptTF.requestFocus();  
  22.                             } }  
  23.                           
  24.                     }  
  25.                 }, java.awt.AWTEvent.KEY_EVENT_MASK);  
  26.   
  27.     }  

 

 

四,解压核心代码

Java代码   收藏代码
  1. /*** 
  2.      * 解压zip 
  3.      *  
  4.      * @param zipFile 
  5.      * @param decompressLoc 
  6.      *            :解压之后的文件所在目录 
  7.      * @throws ArchiveException 
  8.      * @throws IOException 
  9.      */  
  10.     public static boolean deCompressRecursion(String zipFile,  
  11.             File decompressLoc, String charSet) throws ArchiveException,  
  12.             IOException {  
  13.         FileInputStream fin = new FileInputStream(zipFile);  
  14.         ArchiveInputStream archIns = new ArchiveStreamFactory()  
  15.                 .createArchiveInputStream(ArchiveStreamFactory.ZIP, fin);  
  16.         ZipArchiveInputStream zipIn = (ZipArchiveInputStream) archIns;  
  17.         boolean isSuccess = deCompressRecursion(zipIn, decompressLoc, charSet);  
  18.         zipIn.close();  
  19.         return isSuccess;  
  20.     }  
  21. /*** 
  22.      * 递归解压缩. 
  23.      *  
  24.      * @param zipIn 
  25.      * @param decompressLoc 
  26.      * @return 
  27.      * @throws IOException 
  28.      */  
  29.     private static boolean deCompressRecursion(ZipArchiveInputStream zipIn,  
  30.             File decompressLoc, String charset) throws IOException {  
  31.         ZipArchiveEntry zipEntry;  
  32.         if (ValueWidget.isNullOrEmpty(charset)) {  
  33.             charset = SystemHWUtil.CHARSET_UTF;  
  34.         }  
  35.         while (!ValueWidget.isNullOrEmpty(zipEntry = zipIn.getNextZipEntry())) {  
  36.             byte[] rawName = zipEntry.getRawName();  
  37.             String fileName = new String(rawName, charset);  
  38.             // System.out.println(fileName);  
  39.             if (zipEntry.isDirectory()) {// 是目录  
  40.                 File newFolder = new File(decompressLoc, fileName);// 若子目录不存在,则创建之  
  41.                 if(isPrint)  
  42.                 System.out.println(newFolder.getAbsolutePath());  
  43.                 if (!newFolder.exists()) {  
  44.                     newFolder.mkdir();  
  45.                 }  
  46.                 // deCompressRecursion(zipIn, decompressLoc,charset);  
  47.             } else {// 是普通文件  
  48.                 File singFile = new File(decompressLoc, fileName);  
  49.                 if(isPrint)  
  50.                 System.out.println(singFile.getAbsolutePath());  
  51.                 if (singFile.exists()) {// 若解压后的文件已经存在,则直接退出  
  52.                     GUIUtil23.warningDialog("File \""  
  53.                             + singFile.getAbsolutePath() + "\" does  exist.");  
  54.                     return false;  
  55.                 }  
  56.                 /** 
  57.                  * 以下四行代码是后来添加的,为了解决父目录不存在的问题 
  58.                  */  
  59.                 File fatherFolder = singFile.getParentFile();  
  60.                 if (!fatherFolder.exists()) {  
  61.                     fatherFolder.mkdirs();  
  62.                 }  
  63.                 FileUtils.writeIn2Output(zipIn, new FileOutputStream(singFile),  
  64.                         truefalse);  
  65.             }  
  66.         }  
  67.         return true;  
  68.     }  

 

五,压缩核心代码

Java代码   收藏代码
  1. /*** 
  2.      * 压缩文件. 
  3.      *  
  4.      * @param zipFile 
  5.      * @param folderPaths 
  6.      * @return 
  7.      * @throws ArchiveException 
  8.      * @throws IOException 
  9.      */  
  10.     public static boolean compressZipRecursion(String zipFile,  
  11.             String folderPaths) throws ArchiveException, IOException {  
  12.         FileOutputStream fou = new FileOutputStream(zipFile);  
  13.         ArchiveOutputStream archOuts = new ArchiveStreamFactory()  
  14.                 .createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);  
  15.         if (archOuts instanceof ZipArchiveOutputStream) {  
  16.             ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;  
  17.             List<ZipArchiveEntry> zipEntrys = getZipFileListRecursion(new File(  
  18.                     folderPaths), null);  
  19.             for (int i = 0; i < zipEntrys.size(); i++) {  
  20.                 ZipArchiveEntry zipEntry2 = zipEntrys.get(i);  
  21.                 zipOut.putArchiveEntry(zipEntry2);  
  22.                 File file = new File(folderPaths, zipEntry2.getName());  
  23.                 if (!file.exists()) {  
  24.                     return false;  
  25.                 }  
  26.                 if (!file.isDirectory()) {  
  27.                     FileInputStream fin = new FileInputStream(file);  
  28.                     // 不要关闭zipOut,关闭之前要执行closeArchiveEntry()  
  29.                     FileUtils.writeIn2Output(fin, zipOut, falsetrue);  
  30.                 }  
  31.             }  
  32.             closeZip(zipOut, true);  
  33.   
  34.         }  
  35.         return true;  
  36.     }  
相关文章
|
前端开发 Java
Java压缩20M文件非常厉害
Java压缩20M文件非常厉害
81 1
|
存储 Java 文件存储
如何用 Java 压缩 ZIP 文件?
【2月更文挑战第21天】
511 1
|
Java
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
188 0
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
Java实现多文件打包成压缩包下载
Java实现多文件打包成压缩包下载
507 0
|
8月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
300 5
|
9月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
230 2
|
9月前
|
算法 Java
Java 压缩文件
在Java中压缩文件是一个常见的需求,通常可以通过使用Java自带的`java.util.zip`包来实现。这个包提供了`ZipOutputStream`类来创建ZIP格式的压缩文件。以下是一个简单的示例,展示了如何将多个文件压缩到一个ZIP文件中。 ### 示例:将多个文件压缩到一个ZIP文件中 ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipFilesExample { public static vo
|
10月前
|
Java 大数据 测试技术
Java对象头压缩---- 永久为Java应用“降本增效”
本文介绍了一下OpenJDK的最新技术,对象头压缩,来大幅优化Java对象的内存占用。
|
10月前
|
Java
Java SpringBoot 7z 压缩、解压
Java SpringBoot 7z 压缩、解压
134 1