java 壓縮(解壓)檔案或者資料夾工具類
用的是jdk自帶的類,不需要匯入其他jar
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
public class ZipUtil {
/**
* 解壓到指定目錄
*
* @param zipPath
* @param descDir
* @author isea533
*/
@Deprecated
public static void unZipFiles(String zipPath, String descDir)
throws IOException {
unZipFiles(new File(zipPath), descDir);
}
/**
* 解壓檔案到指定目錄
*
* @param zipFile
* @param descDir
* @author isea533
*/
@SuppressWarnings("rawtypes")
public static void unZipFiles(File zipFile, String descDir)
throws IOException {
File pathFile = new File(descDir);
if (!pathFile.exists()) {
pathFile.mkdirs();
}
ZipFile zip = new ZipFile(zipFile);
for (Enumeration entries = zip.getEntries(); entries.hasMoreElements();) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
outPath = new String(outPath.getBytes("utf-8"), "ISO8859-1");
;
// 判斷路徑是否存在,不存在則建立檔案路徑
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
if (!file.exists()) {
file.mkdirs();
}
// 判斷檔案全路徑是否為資料夾,如果是上面已經上傳,不需要解壓
if (new File(outPath).isDirectory()) {
continue;
}
// 輸出檔案路徑資訊
//System.out.println(outPath);
OutputStream out = new FileOutputStream(outPath);
byte[] buf1 = new byte[1024];
int len;
while ((len = in.read(buf1)) > 0) {
out.write(buf1, 0, len);
}
in.close();
out.close();
}
}
/**
* 遞迴壓縮檔案
*
* @param source
* 源路徑,可以是檔案,也可以目錄
* @param destinct
* 目標路徑,壓縮檔名
* @throws IOException
*/
public static void compress(String source, String destinct)
throws IOException {
List fileList = loadFilename(new File(source));
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
new File(destinct)));
byte[] buffere = new byte[8192];
int length;
BufferedInputStream bis;
for (int i = 0; i < fileList.size(); i++) {
File file = (File) fileList.get(i);
zos.putNextEntry(new ZipEntry(getEntryName(source, file)));
bis = new BufferedInputStream(new FileInputStream(file));
while (true) {
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
zos.close();
}
/**
* 遞迴獲得該檔案下所有檔名(不包括目錄名)
*
* @param file
* @return
*/
private static List loadFilename(File file) {
List filenameList = new ArrayList();
if (file.isFile()) {
filenameList.add(file);
}
if (file.isDirectory()) {
for (File f : file.listFiles()) {
filenameList.addAll(loadFilename(f));
}
}
return filenameList;
}
/**
* 獲得zip entry 字串
*
* @param base
* @param file
* @return
*/
private static String getEntryName(String base, File file) {
File baseFile = new File(base);
String filename = file.getPath();
// int index=filename.lastIndexOf(baseFile.getName());
if (baseFile.getParentFile().getParentFile() == null)
return filename.substring(baseFile.getParent().length());
return filename.substring(baseFile.getParent().length() + 1);
}
public static void main(String[] args) throws IOException {
//compress("D:/tomcat-5.5.20","d:/test/testZip.zip");
unZip("D:/saas-plugin-web-master-shiro-mybatis.zip","D:/123");
}
private static final int buffer = 2048;
/**
* 解壓Zip檔案
* @param path 檔案目錄
*/
public static void unZip(String path,String savepath)
{
int count = -1;
File file = null;
InputStream is = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
new File(savepath).mkdir(); //建立儲存目錄
ZipFile zipFile = null;
try
{
zipFile = new ZipFile(path,"gbk"); //解決中文亂碼問題
Enumeration<?> entries = zipFile.getEntries();
while(entries.hasMoreElements())
{
byte buf[] = new byte[buffer];
ZipEntry entry = (ZipEntry)entries.nextElement();
String filename = entry.getName();
boolean ismkdir = false;
if(filename.lastIndexOf("/") != -1){ //檢查此檔案是否帶有資料夾
ismkdir = true;
}
filename = savepath + filename;
if(entry.isDirectory()){ //如果是資料夾先建立
file = new File(filename);
file.mkdirs();
continue;
}
file = new File(filename);
if(!file.exists()){ //如果是目錄先建立
if(ismkdir){
new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs(); //目錄先建立
}
}
file.createNewFile(); //建立檔案
is = zipFile.getInputStream(entry);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, buffer);
while((count = is.read(buf)) > -1)
{
bos.write(buf, 0, count);
}
bos.flush();
bos.close();
fos.close();
is.close();
}
zipFile.close();
}catch(IOException ioe){
ioe.printStackTrace();
}finally{
try{
if(bos != null){
bos.close();
}
if(fos != null) {
fos.close();
}
if(is != null){
is.close();
}
if(zipFile != null){
zipFile.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
使用:
下面是介紹壓縮檔案:
//原檔案路徑
String newPath= userPath + fileSeparator +followFile.getName();
//目標檔案路徑,拼接上壓縮後的檔名
String after = zipAfter + fileSeparator + followFile.getName()+".zip";
// 壓縮檔案
ZipUtil.compress(newPath, after);
相關文章
- Java實現解壓縮檔案和資料夾Java
- 使用Java API進行tar.gz檔案及資料夾壓縮解壓縮JavaAPI
- Linux加密壓縮檔案/資料夾Linux加密
- 使用libzip壓縮檔案和資料夾
- c# 上傳壓縮包 解壓,遍歷資料夾和檔案C#
- linux 下壓縮與解壓資料夾Linux
- Java實現壓縮資料夾Java
- .NET 壓縮/解壓檔案
- tar解壓到指定目錄並去掉壓縮檔案的層級資料夾
- 使用java API進行zip遞迴壓縮資料夾以及解壓JavaAPI遞迴
- Linux下對於檔案或者目錄的打包及壓縮、解壓Linux
- 檔案壓縮和解壓縮
- linux 下面壓縮、解壓.rar檔案Linux
- 分卷壓縮怎麼解壓 快速解壓電腦分卷壓縮檔案方法
- 電腦怎麼壓縮檔案 檔案壓縮方法詳解
- betterzip怎麼解壓檔案?如何使用BetterZip批次解壓壓縮檔案
- NCH ExpressZip Plus for mac(檔案解壓縮工具)ExpressMac
- Linux下檔案的壓縮與解壓Linux
- 初級:如何在 Linux 中 zip 壓縮檔案和資料夾Linux
- 工作經驗: linux 壓縮當前資料夾下所有檔案Linux
- 利用java建立檔案或者資料夾Java
- Linux打包壓縮解壓工具Linux
- Keka for Mac(壓縮解壓工具)Mac
- Keka for Mac壓縮解壓工具Mac
- MyZip for mac解壓壓縮工具Mac
- linux系統壓縮,解壓檔案筆記Linux筆記
- Linux中檔案的壓縮和解壓縮Linux
- java中檔案如何加密壓縮?Java加密
- java中 檔案壓縮處理Java
- java 生成 zip格式 壓縮檔案Java
- java 把檔案壓縮成 zipJava
- Linux科研武器庫 - 檔案壓縮與解壓縮 - zip / unzipLinux
- linux檔案壓縮和解壓命令Linux
- linux 高效壓縮工具之xz的壓縮解壓使用Linux
- Windows的壓縮資料夾(zip/cab)Windows
- Mac壓縮解壓工具:Keka for MacMac
- A-Zippr for Mac 壓縮解壓工具Mac
- Linux中Bin檔案壓縮包解壓執行Linux