/**
?* 利用zip庫壓縮/解壓文件夾
?* 因為java的基本zip庫是不支持中文文件名的。所以壓縮后中文名的條目都變成了亂碼,利用rar解壓工具解壓不了名字為亂碼的壓縮文件,但自己寫的解壓方法在windows下解壓后編碼正常顯示中文,而其他系統下則不能正常還原;
?
?
* 可以用ant.jar包下的zip類來壓縮文件夾,apache tools下的zip庫是支持中文的。(ant.jar包下面可以下載)
? 第一種是沒處理中文亂碼的···
?
* @author 小苗
?*/
? 第一種:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* 壓縮一個目錄,包括目錄下的所有文件
* java的基本zip庫是不支持中文文件名的。
* 可以用ant.jar包下的zip類,apache tools下的zip庫是支持中文的。
* @author 小苗
*/
public class CompressDir {
/**
* 壓縮文件夾方法(此方法壓縮后有根目錄且名字與被壓縮文件夾名一樣,效果如圖1)
* @param inputFile 被壓縮的文件夾
* @param str 壓縮條目根目錄名
* @param zipFile 壓縮后的輸出流
* @throws IOException
*/
public void comDir2(File inputFile,String str,ZipOutputStream zipFile) throws IOException{
//判斷文件是否為文件夾
if(inputFile.isDirectory()){
File[] files = inputFile.listFiles();
zipFile.putNextEntry(new ZipEntry(str+"/")); //使用指定名字創建壓縮條目
str = str.length()==0 ? "":str+"/";
for (int i=0;i<files.length;i++) {
comDir2(files[i],str+files[i].getName(), zipFile); //遞歸調用壓縮方法
}
}else{
InputStream in = new FileInputStream(inputFile);
//開始寫入新的 ZIP 文件條目并將流定位到條目數據的開始處。
ZipEntry zipname = new ZipEntry(str);
zipFile.putNextEntry(zipname);
byte[] buff = new byte[1024];
int len = 0;
while((len = in.read(buff))!=-1){
zipFile.write(buff, 0, len);
}
in.close();
}
}
/**
* @param s3 被壓縮的文件夾
* @param s4 壓縮后輸出路徑
* @throws IOException
*/
public void comDir(File s3,File s4) throws IOException {
System.out.println("正在壓縮文件···");
//定義 Zip格式的輸出流
ZipOutputStream zip_out = new ZipOutputStream(new FileOutputStream(s4));
comDir2(s3,s3.getName(),zip_out); //調用壓縮方法
zip_out.close(); //關閉流
}
/**
* 解壓縮zip文件的方法
* @param zipFileName 要被解壓的文件
* @param outputDirectory 解壓輸出路徑
*/
public void unzip(String zipFileName, String outputDirectory) {
System.out.println("正在解壓···");
try {
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
/*獲取ZipInputStream中的ZipEntry條目,一個zip文件中可能包含多個ZipEntry,
*當getNextEntry方法的返回值為null,則代表ZipInputStream中沒有下一個ZipEntry,
*輸入流讀取完成;
*/
ZipEntry z = in.getNextEntry();
while (z != null) {
System.out.println("unziping " + z.getName());
//創建以zip包文件名為目錄名的根目錄
File f = new File(outputDirectory);
f.mkdirs();
if (z.isDirectory()) {
String name = z.getName();
name = name.substring(0, name.length() - 1);
f = new File(outputDirectory + File.separator + name);
f.mkdirs();
} else {
f = new File(outputDirectory + File.separator + z.getName());
f.createNewFile();
FileOutputStream out = new FileOutputStream(f);
byte[] buff = new byte[1024];
int len ;
while ((len = in.read(buff)) != -1) {
out.write(buff,0,len);
}
out.close();
}
z = in.getNextEntry(); //讀取下一個ZipEntry
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
CompressDir com = new CompressDir();
//壓縮
com.comDir(new File("d:\\Temp"), new File("d:\\temp.zip"));
System.out.println("壓縮完成!");
//解壓 如果此處不指定解壓的具體目錄,如:test2,那么則直接解壓到根目錄下
com.unzip("d:\\temp.zip", "d:\\");
System.out.println("解壓完成!");
}
}
??
第二種:
問題:①怎么解決中文名文件壓縮后為亂碼
?* java的基本zip庫是不支持中文文件名的。參考了網上的一些解決方法
?* 發現Ant的apache tools下的zip庫是支持中文的。
?* 下面就是采用該方式實現的在中文文件名下的文件壓縮代碼:
?? 在給出實現代碼之前,有一點需要指出,那就是必須要在工程中引Ant.jar的包,此包下面可以下載。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream
;
/**
* @author 小苗
*/
//此方法壓縮后 沒有根目錄,效果如圖2
public class CompressDir02 {
public static File inpath = new File("d:\\Temp");
public static ZipOutputStream zout = null; //輸出流確定
static {
try {
zout = new ZipOutputStream(new FileOutputStream("d:\\temp.zip"));
// zout.setEncoding("GBK");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void dozip(File file) {
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile()) {
docopy(f);
} else
dozip(f);
}
}
public void docopy(File f) {
try {
InputStream in = new FileInputStream(f);
//創建壓縮條目
String tempPath = f.getAbsolutePath().replace(
inpath.getAbsolutePath() + "\\", "");
ZipEntry zent = new ZipEntry(tempPath);
System.out.println("壓縮條目:"+tempPath);
zout.putNextEntry(zent);
byte[] buff = new byte[1024];
int len = 0;
while ((len = in.read(buff)) != -1) {
zout.write(buff, 0, len);
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
CompressDir02 com = new CompressDir02();
File ff = new File("d:\\Temp");
System.out.println("開始壓縮文件···");
com.dozip(ff);
System.out.println("壓縮完成!");
com.zout.close();
}
}
??
?
?
圖1:
?
?
?????? ??????????????????????????????????????????????????????????????? 圖2:
?
?
?
?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

