Java 解压缩助手
我使用Java swing做了一个zip解压缩助手,界面如下:
使用的依赖包:
为什么不用java 自带的ZipUtil呢?因为 没有乱码问题.
技术问题
一,如何使窗口居中?
Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
setSize(600, 280);
Dimension framesize = getSize();
int x = (int)screensize.getWidth()/2 - (int)framesize.getWidth()/2;
int y = (int)screensize.getHeight()/2 - (int)framesize.getHeight()/2;
setLocation(x,y);
二,增加助记键
效果:按Alt+C 时触发压缩按钮的点击事件,按Alt+D 触发解压按钮的单击事件
三,全局快捷键
/***
* 设置全局快捷键,按Alt+r ,则命令输入框自动聚焦
*/
private void globalShortcutKeys(){
//Add global shortcuts
Toolkit toolkit = Toolkit.getDefaultToolkit();
// 注册应用程序全局键盘事件, 所有的键盘事件都会被此事件监听器处理.
toolkit.addAWTEventListener(
new java.awt.event.AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
if (event.getClass() == KeyEvent.class) {
KeyEvent kE = ((KeyEvent) event);
// 处理按键事件 Ctrl+Enter
if ((kE.getKeyCode() == KeyEvent.VK_R)
&& (((InputEvent) event)
.isAltDown())&& kE.getID() == KeyEvent.KEY_PRESSED) {
System.out.println("Alt+r");
shScriptTF.requestFocus();
} }
}
}, java.awt.AWTEvent.KEY_EVENT_MASK);
}
四,解压核心代码
/***
* 解压zip
*
* @param zipFile
* @param decompressLoc
* :解压之后的文件所在目录
* @throws ArchiveException
* @throws IOException
*/
public static boolean deCompressRecursion(String zipFile,
File decompressLoc, String charSet) throws ArchiveException,
IOException {
FileInputStream fin = new FileInputStream(zipFile);
ArchiveInputStream archIns = new ArchiveStreamFactory()
.createArchiveInputStream(ArchiveStreamFactory.ZIP, fin);
ZipArchiveInputStream zipIn = (ZipArchiveInputStream) archIns;
boolean isSuccess = deCompressRecursion(zipIn, decompressLoc, charSet);
zipIn.close();
return isSuccess;
}
/***
* 递归解压缩.
*
* @param zipIn
* @param decompressLoc
* @return
* @throws IOException
*/
private static boolean deCompressRecursion(ZipArchiveInputStream zipIn,
File decompressLoc, String charset) throws IOException {
ZipArchiveEntry zipEntry;
if (ValueWidget.isNullOrEmpty(charset)) {
charset = SystemHWUtil.CHARSET_UTF;
}
while (!ValueWidget.isNullOrEmpty(zipEntry = zipIn.getNextZipEntry())) {
byte[] rawName = zipEntry.getRawName();
String fileName = new String(rawName, charset);
// System.out.println(fileName);
if (zipEntry.isDirectory()) {// 是目录
File newFolder = new File(decompressLoc, fileName);// 若子目录不存在,则创建之
if(isPrint)
System.out.println(newFolder.getAbsolutePath());
if (!newFolder.exists()) {
newFolder.mkdir();
}
// deCompressRecursion(zipIn, decompressLoc,charset);
} else {// 是普通文件
File singFile = new File(decompressLoc, fileName);
if(isPrint)
System.out.println(singFile.getAbsolutePath());
if (singFile.exists()) {// 若解压后的文件已经存在,则直接退出
GUIUtil23.warningDialog("File \""
+ singFile.getAbsolutePath() + "\" does exist.");
return false;
}
/**
* 以下四行代码是后来添加的,为了解决父目录不存在的问题
*/
File fatherFolder = singFile.getParentFile();
if (!fatherFolder.exists()) {
fatherFolder.mkdirs();
}
FileUtils.writeIn2Output(zipIn, new FileOutputStream(singFile),
true, false);
}
}
return true;
}
五,压缩核心代码
/***
* 压缩文件.
*
* @param zipFile
* @param folderPaths
* @return
* @throws ArchiveException
* @throws IOException
*/
public static boolean compressZipRecursion(String zipFile,
String folderPaths) throws ArchiveException, IOException {
FileOutputStream fou = new FileOutputStream(zipFile);
ArchiveOutputStream archOuts = new ArchiveStreamFactory()
.createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);
if (archOuts instanceof ZipArchiveOutputStream) {
ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;
List<ZipArchiveEntry> zipEntrys = getZipFileListRecursion(new File(
folderPaths), null);
for (int i = 0; i < zipEntrys.size(); i++) {
ZipArchiveEntry zipEntry2 = zipEntrys.get(i);
zipOut.putArchiveEntry(zipEntry2);
File file = new File(folderPaths, zipEntry2.getName());
if (!file.exists()) {
return false;
}
if (!file.isDirectory()) {
FileInputStream fin = new FileInputStream(file);
// 不要关闭zipOut,关闭之前要执行closeArchiveEntry()
FileUtils.writeIn2Output(fin, zipOut, false, true);
}
}
closeZip(zipOut, true);
}
return true;
}
源码zip_mgmt.zip及依赖的jar包见附件
参考:http://hw1287789687.iteye.com/blog/2050132