1. 程式人生 > >JAVA UI 實現ZIP的壓縮與解壓縮

JAVA UI 實現ZIP的壓縮與解壓縮

open return filepath sdi 每一個 util child length 壓縮與解壓縮

壓縮與解壓縮代碼

package ZIP;


import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class Zipun {
public static void zip(String srcRootDir,File file,ZipOutputStream zos) throws Exception{
if(file == null) return;
if(file.isFile()){
int count;
//獲取文件相對於壓縮文件夾根目錄的子路徑
String subPath = file.getAbsolutePath();
int index = subPath.indexOf(srcRootDir);
if(index != -1){
subPath = subPath.substring(srcRootDir.length() + 1);
}
ZipEntry entry = new ZipEntry(subPath);
zos.putNextEntry(entry);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
while((count = bis.read())!=-1)
zos.write(count);
bis.close();
zos.closeEntry();
}
else{
File[] childFileList = file.listFiles();
for(int i=0;i<childFileList.length;i++){
childFileList[i].getAbsolutePath().indexOf(file.getAbsolutePath());
zip(srcRootDir,childFileList[i],zos);
}
}
}
/**
* zip程序入口
* @param srcPath 源文件路徑
* @param zipPath 壓縮文件的路徑
* @param zipFileName 壓縮文件的名字
* @throws Exception 拋出異常
*/
public static void zip(String srcPath,String zipPath,String zipFileName) throws Exception{
ZipOutputStream zos = null;
try{
File srcFile = new File(srcPath);
/**
* 防止無限遞歸
*/
if(srcFile.isDirectory()&&zipPath.indexOf(srcPath) != -1){
throw new Exception("無限遞歸");
}
/**
* 判斷壓縮文件保存的路徑是否存在,不存在,就創建
*/
File zipDir = new File(zipPath);
if(!zipDir.exists() || !zipDir.isDirectory()){
zipDir.mkdirs();
}
//如果只是壓縮一個文件,則需要截取該文件的父目錄
String srcRootDir = srcPath;
if(srcFile.isFile()){
int index = srcPath.lastIndexOf(File.separator);
if(index != -1){
srcRootDir = srcPath.substring(0,index);
}
}
/**
* 調用遞歸的方法進行目錄或文件的壓縮
*/
zos = new ZipOutputStream(new FileOutputStream(new File(zipPath+File.separator+zipFileName)));
//System.out.println(srcDir);
zip(srcRootDir,srcFile,zos);
zos.flush();
}catch(Exception e){
e.printStackTrace();
}finally {
if(zos != null) zos.close();
}
}
/**
* 解壓縮zip包
* @param zipFilePath zip文件的全路徑
* @param unzipFilePath 解壓後的文件保存的路徑
* @param includeZipFileName 解壓後的文件保存的路徑是否包含壓縮文件的文件名。true-包含;false-不包含
*/
public static void unzip(String zipFilePath, String unzipFilePath) throws Exception
{

File zipFile = new File(zipFilePath);
//創建解壓縮文件保存的路徑
File unzipFileDir = new File(unzipFilePath);
if (!unzipFileDir.exists() || !unzipFileDir.isDirectory())
{
unzipFileDir.mkdirs();
}

//開始解壓
ZipEntry entry = null;
String entryFilePath = null, entryDirPath = null;
File entryFile = null, entryDir = null;
int index = 0, count = 0, bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
ZipFile zip = new ZipFile(zipFile);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zip.entries();
//循環對壓縮包裏的每一個文件進行解壓
while(entries.hasMoreElements())
{
entry = entries.nextElement();
//構建壓縮包中一個文件解壓後保存的文件全路徑
entryFilePath = unzipFilePath + File.separator + entry.getName();
//構建解壓後保存的文件夾路徑
index = entryFilePath.lastIndexOf(File.separator);
if (index != -1)
{
entryDirPath = entryFilePath.substring(0, index);
}
else
{
entryDirPath = "";
}
entryDir = new File(entryDirPath);
//如果文件夾路徑不存在,則創建文件夾
if (!entryDir.exists() || !entryDir.isDirectory())
{
entryDir.mkdirs();
}

//創建解壓文件
entryFile = new File(entryFilePath);
if (entryFile.exists())
{
//刪除已存在的目標文件
entryFile.delete();
}

//寫入文件
bos = new BufferedOutputStream(new FileOutputStream(entryFile));
bis = new BufferedInputStream(zip.getInputStream(entry));
while ((count = bis.read(buffer, 0, bufferSize)) != -1)
{
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
}
}

}
UI 部分代碼

package ZIP;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
import java.util.zip.*;
import javax.swing.*;
import ZIP.Zipun;

public class ZipTest{
public static void main(String[] args){
EventQueue.invokeLater(new Runnable() {
@Override
public void run(){
ZipTestFrame frame = new ZipTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}


class ZipTestFrame extends JFrame {

public ZipTestFrame(){
setTitle("李華東 201501060709");
//窗口大小
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

//創建菜單
JMenuBar menuBar = new JMenuBar();
JMenu menu1 = new JMenu("解壓") ;
JMenu menu2 = new JMenu("壓縮") ;

JMenuItem openItem = new JMenuItem("選擇一個zip文件");
menu1.add(openItem);
openItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
//選擇文件
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("D:\\"));
//打開文件選擇器對話框
int r = chooser.showOpenDialog(ZipTestFrame.this);
if (r == JFileChooser.APPROVE_OPTION){
//獲取文件路徑
zipname = chooser.getSelectedFile().getPath();
scanZipFile();
}
}
});
//開始解壓
JMenuItem jieyaItem = new JMenuItem("開始解壓");
menu1.add(jieyaItem);
jieyaItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
try {
model.addElement("開始解壓到文件所在目錄") ;
Zipun.unzip(zipname, zipname.substring(0, zipname.lastIndexOf(".")));
model.addElement("解壓成功!") ;
} catch (Exception e) {
model.addElement("解壓錯誤!") ;
e.printStackTrace();
}
}
});
// 添加
JMenuItem addItem = new JMenuItem("添加要壓縮的文件或文件夾");
menu2.add(addItem);
addItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
//選擇文件
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES) ;
chooser.setCurrentDirectory(new File("D://"));
int r = chooser.showOpenDialog(ZipTestFrame.this);
if (r == JFileChooser.APPROVE_OPTION){
addFilename = chooser.getSelectedFile().getPath();
addFile() ;
System.out.println(addFilename) ;
}
}
});

//壓縮選定文件
JMenuItem zipItem = new JMenuItem("開始壓縮");
menu2.add(zipItem);
zipItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
try {
Zipun.zip(addFilename,addFilename.substring(0, addFilename.lastIndexOf(File.separator)),new File(addFilename).getName()+".zip");
model.addElement("壓縮成功!") ;

} catch (Exception e) {
model.addElement("壓縮錯誤!") ;
e.printStackTrace();
}
}
});

// exit
JMenuItem exitItem = new JMenuItem("退出");
menu1.add(exitItem);
exitItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event)
{
System.exit(0);
}
});
menuBar.add(menu1);
menuBar.add(menu2) ;
setJMenuBar(menuBar);

model = new DefaultListModel() ;
model.addElement("文件列表") ;
fileList = new JList(model);
add(new JScrollPane(fileList), BorderLayout.CENTER);
}

//顯示文件列表
public void scanZipFile(){
model.removeAllElements() ;
new SwingWorker<Void, String>(){
@Override
protected Void doInBackground() throws Exception{
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
while ((entry = zin.getNextEntry()) != null){
publish(entry.getName());
zin.closeEntry();
}
zin.close();
return null;
}
@Override
protected void process(List<String> names){
for (String name : names)
model.addElement(name);
}
}.execute();
}


public void addFile(){
//System.out.println("addFile()") ;
model.removeAllElements() ;
model.addElement("準備壓縮: "+addFilename) ;
model.addElement("到當前目錄下的 "+new File(addFilename).getName()+".zip 文件下") ;
}
/**
* 設置寬度和長度
* 自適應當前屏幕的大小
*/
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
public final int DEFAULT_WIDTH = (int)screenSize.getWidth()/2;
public final int DEFAULT_HEIGHT = (int)screenSize.getHeight()/2;

private JList fileList;
private String zipname;
private String addFilename ;
DefaultListModel model ;

}

JAVA UI 實現ZIP的壓縮與解壓縮