一、前言
本篇博客記錄一下用 java 實現文件夾壓縮的功能,大家可根據自己的需求封裝成工具類來使用。傳入指定的文件夾路徑,可在同級目錄下面生成一個壓縮後的文件,還可以指定壓縮文件的根目錄。
二、效果圖
三、實現代碼測試類
package top.zywork.test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 將指定文件夾下的所有文件壓縮
*/
public class ZipFilesUtils {
public static void compress(File f, String baseDir, ZipOutputStream zos){
if(!f.exists()){
System.out.println("待壓縮的文件目錄或文件"+f.getName()+"不存在");
return;
}
File[] fs = f.listFiles();
BufferedInputStream bis = null;
//ZipOutputStream zos = null;
byte[] bufs = new byte[1024*10];
FileInputStream fis = null;
try{
//zos = new ZipOutputStream(new FileOutputStream(zipFile));
for(int i=0; i<fs.length; i++){
String fName = fs[i].getName();
System.out.println("壓縮:" + baseDir+fName);
if(fs[i].isFile()){
ZipEntry zipEntry = new ZipEntry(baseDir+fName);//
zos.putNextEntry(zipEntry);
//讀取待壓縮的文件並寫進壓縮包裏
fis = new FileInputStream(fs[i]);
bis = new BufferedInputStream(fis, 1024*10);
int read = 0;
while((read=bis.read(bufs, 0, 1024*10))!=-1){
zos.write(bufs, 0, read);
}
//如果需要刪除源文件,則需要執行下面2句
//fis.close();
//fs[i].delete();
}
else if(fs[i].isDirectory()){
compress(fs[i], baseDir+fName+"/", zos);
}
}//end for
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//關閉流
try {
if(null!=bis)
bis.close();
//if(null!=zos)
//zos.close();
if(null!=fis)
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main( String[] args ) throws ParseException
{
String sourceFilePath = "C:\\Users\\Wangchenchen\\Desktop\\test\\Release";
File sourceDir = new File(sourceFilePath);
File zipFile = new File(sourceFilePath+".zip");
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(new FileOutputStream(zipFile));
String baseDir = "";
compress(sourceDir, baseDir, zos);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(zos!=null)
try {
zos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
四、封裝工具類代碼
將上面的測試代碼稍微封裝一下,封裝成工具類來調用。代碼如下:
package top.zywork.common;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class FileUtils {
/**
* 壓縮文件
* @param f 原文件
* @param baseDir 打包根目錄
* @param zos 壓縮文件
* @param deleteSourceFile 是否需要刪除原文件,例如:true=刪除原文件、false=不刪除原文件
*/
public static void compress(File f, String baseDir, ZipOutputStream zos, boolean deleteSourceFile) {
if(!f.exists()){
System.out.println("待壓縮的文件目錄或文件"+f.getName()+"不存在");
return;
}
File[] fs = f.listFiles();
BufferedInputStream bis = null;
//ZipOutputStream zos = null;
byte[] bufs = new byte[1024*10];
FileInputStream fis = null;
try{
//zos = new ZipOutputStream(new FileOutputStream(zipFile));
for(int i=0; i<fs.length; i++){
String fName = fs[i].getName();
System.out.println("壓縮:" + baseDir+fName);
if(fs[i].isFile()){
ZipEntry zipEntry = new ZipEntry(baseDir+fName);//
zos.putNextEntry(zipEntry);
//讀取待壓縮的文件並寫進壓縮包裏
fis = new FileInputStream(fs[i]);
bis = new BufferedInputStream(fis, 1024*10);
int read = 0;
while((read=bis.read(bufs, 0, 1024*10))!=-1){
zos.write(bufs, 0, read);
}
//如果需要刪除源文件,則需要執行下面2句
if (deleteSourceFile) {
fis.close();
fs[i].delete();
}
}
else if(fs[i].isDirectory()){
compress(fs[i], baseDir+fName+"/", zos, false);
}
}//end for
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//關閉流
try {
if (null!=bis) {
bis.close();
}
//if(null!=zos)
//zos.close();
if (null!=fis) {
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 打包指定路徑的文件夾
* @param sourceFilePath 源文件加地址,例如:C:\\test 必填
* @param baseDir 打包的根目錄名,例如:download/ 非必填
* @param deleteSourceFile 是否需要刪除原文件,例如:true=刪除原文件、false=不刪除原文件 必填
*/
public static void compress(String sourceFilePath, String baseDir, boolean deleteSourceFile) {
File sourceDir = new File(sourceFilePath);
File zipFile = new File(sourceFilePath+".zip");
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(new FileOutputStream(zipFile));
compress(sourceDir, baseDir, zos, deleteSourceFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if (zos!=null) {
try {
zos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
五、結尾
博主碼字不易,如果你覺得本文對你有用,不妨點個贊再走吧。
更多精彩好文請移步:http://wjhsmart.vip
如果需要友聯的朋友可聯繫博主互聯哦