之前介紹了利用java
util
zip這個package裡的class來完成壓縮及解壓縮的工作
但是我們知道
java對於文字的編碼是以unicode為基礎
因此
若是以ZipInputStream及ZipOutputStream來處理壓縮及解壓縮的工作
碰到中文檔名或路徑
那當然是以unicode來處理羅!
但是
現在市面上的壓縮及解壓縮軟體
例如winzip
卻是不支援unicode的
一碰到檔名以unicode編碼的檔案
它就不處理
那要如何才能做出讓winzip能夠處理的壓縮檔呢?那就得從修改ZipInputStream及ZipOutputStream對於檔名的編碼方式來著手了
我們可以從jdk的src
zip取得ZipInputStream及ZipOutputStream的原始碼來加以修改
一ZipOutputStreamjava 從jdk的src
zip取得ZipOutputStream
java原始碼
另存新檔存到c:\java\util\zip這個資料夾裡
檔名改為CZipOutputStream
java
開始修改原始碼
將class名稱改為CZipOutputStream
建構式也必須更改為CZipOutputStream
新增member
這個member記錄編碼方式
private String encoding=
UTF
;
再新增一個建構式(這個建構式可以讓這個class在new的時候
設定檔名的編碼)
public CZipOutputStream(OutputStream out
String encoding) {
super(out
new Deflater(Deflater
DEFAULT_COMPRESSION
true));
usesDefaultDeflater = true;
this
encoding=encoding;
}
找到byte[] nameBytes = getUTF
Bytes(e
name);(有二個地方)
將它修改如下
byte[] nameBytes = null;
try
{
if (this
encoding
toUpperCase()
equals(
UTF
))
nameBytes =getUTF
Bytes(e
name);
else
nameBytes= e
name
getBytes(this
encoding);
}
catch(Exception byteE)
{
nameBytes=getUTF
Bytes(e
name);
}
將檔案儲存在c:\java\util\zip這個資料夾內
請記得一定要有這個路徑結構
才能把CZipOutputStream
class放在正確的package結構裡
二ZipInputStreamjava 從jdk的src
zip取得ZipInputStream
java原始碼
另存新檔存到c:\java\util\zip這個資料夾裡
檔名改為CZipInputStream
java
開始修改原始碼
將class名稱改為CZipInputStream
建構式也必須更改為CZipInputStream
新增member
這個member記錄編碼方式
private String encoding=
UTF
;
再新增一個建構式如下(這個建構式可以讓這個class在new的時候
設定檔名的編碼)
public CZipInputStream(InputStream in
String encoding) {
super(new PushbackInputStream(in
)
new Inflater(true)
);
usesDefaultInflater = true;
if(in == null) {
throw new NullPointerException(
in is null
);
}
this
encoding=encoding;
}
找到ZipEntry e = createZipEntry(getUTF
String(b
len));這一行
將它改成如下
ZipEntry e=null;
try
{
if (this
encoding
toUpperCase()
equals(
UTF
))
e=createZipEntry(getUTF
String(b
len));
else
e=createZipEntry(new String(b
len
this
encoding));
}
catch(Exception byteE)
{
e=createZipEntry(getUTF
String(b
len));
}
將檔案儲存在c:\java\util\zip這個資料夾內
請記得一定要有這個路徑結構
才能把CZipInputStream
class放在正確的package結構裡
以上兩個檔案儲存後compile產生CZipOutputStream
class及CZipInputStream
class
使用winzip開啟[java_home]\jre\lib\rt
jar這個檔案
將CZipOutputStream
class及CZipInputStream
class加進去
記得「Save full path info」一定要打勾
以後當壓縮及解壓縮時有中文檔名及路徑的問題時
就可以指定編碼方式來處理了
CZipOutputStream zos=new CZipOutputStream(OutputStream os
String encoding);
CZipInputStream zins=new CZipInputStream(InputStream ins
String encoding);
以「壓縮與解壓縮(
)」為例
FileOutputStream fos =new FileOutputStream(request
getRealPath(
/
)+
myzip
zip
);
CZipOutputStream zos=new CZipOutputStream(fos
BIG
);
其他地方都不用改
便可以處理中文檔名的壓縮
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19592.html