看來,我們還是得使用jdk裏的zip包了,我們的問題僅僅是需要支持GBK,所以修改應該不會很大,所以我們先找出所有相關的類,以下類請自行從jdk的src.zip裏提取
- DeflaterOutputStream.java
- InflaterInputStream.java
- ZipConstants.java
- ZipEntry.java
- ZipInputStream.java
- ZipOutputStream.java
DeflaterOutputStream.java
InflaterInputStream.java
ZipConstants.java
ZipEntry.java
ZipInputStream.java
ZipOutputStream.java
以上java文件我已打包在附件中.
前面不是說ant.jar裏並沒有ZipInputStream.java嘛,這裏需要修改的正是這個類,找到getUTF8String()方法,。(這裏要汗一個,。sun是怎麼想的,連方法名都規定死了是UTF-8),在這個方法裏的所有代碼前加上如下:
- try
- {
- String s = new String(b, off, len, "GBK");//以GBK的方式
- return s;
- }
- catch (UnsupportedEncodingException e)
- {
- e.printStackTrace();
- }
try
{
String s = new String(b, off, len, "GBK");//以GBK的方式
return s;
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
此時就完成以GBK方式操作,但是此時我們在解壓時,還會發現問題,報如下異常:
- Exception in thread "main" java.lang.UnsatisfiedLinkError: com.zwl.zip.ZipEntry.initIDs()V
- at com.zwl.zip.ZipEntry.initIDs(Native Method)
- at com.zwl.zip.ZipEntry.<clinit>(ZipEntry.java:41)
- at com.zwl.zip.ZipInputStream.createZipEntry(ZipInputStream.java:389)
- at com.zwl.zip.ZipInputStream.readLOC(ZipInputStream.java:251)
- at com.zwl.zip.ZipInputStream.getNextEntry(ZipInputStream.java:78)
- at com.conngame.test.TestZip.unzip(TestZip.java:41)
- at com.conngame.test.TestZip.main(TestZip.java:100)
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.zwl.zip.ZipEntry.initIDs()V
at com.zwl.zip.ZipEntry.initIDs(Native Method)
at com.zwl.zip.ZipEntry.<clinit>(ZipEntry.java:41)
at com.zwl.zip.ZipInputStream.createZipEntry(ZipInputStream.java:389)
at com.zwl.zip.ZipInputStream.readLOC(ZipInputStream.java:251)
at com.zwl.zip.ZipInputStream.getNextEntry(ZipInputStream.java:78)
at com.conngame.test.TestZip.unzip(TestZip.java:41)
at com.conngame.test.TestZip.main(TestZip.java:100)
initIDs()方法是在ZipEntry類的static裏調用的,目前還不大清楚這個到底做什麼用,我們只需要在ZipEntry類中找到這個static模塊,註釋掉就行了,
- static
- {
- /* Zip library is loaded from System.initializeSystemClass */
- initIDs();
- }
static
{
/* Zip library is loaded from System.initializeSystemClass */
initIDs();
}
找到以上代碼註釋掉.此時解壓,OK,能完美支持中文
附上測試代碼:
- package com.conngame.test;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import com.zwl.zip.ZipEntry;
- import com.zwl.zip.ZipInputStream;
- import com.zwl.zip.ZipOutputStream;
- /**
- * TestZip.java coding by Serol Luo. [email protected] 2003/07/03
- * http://www.chinaunix.net/forum/viewforum.php?f=26 轉載請保留此信息
- */
- class TestZip
- {
- public void zip(String zipFileName, String inputFile) throws Exception
- {
- zip(zipFileName, new File(inputFile));
- }
- public void zip(String zipFileName, File inputFile) throws Exception
- {
- ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
- zipFileName));
- zip(out, inputFile, "");
- System.out.println("zip done");
- out.close();
- }
- public void unzip(String zipFileName, String outputDirectory)
- throws Exception
- {
- ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
- ZipEntry z;
- // System.out.println("z = in.getNextEntry(): "+((z=in.getNextEntry())!=null));
- while ((z=in.getNextEntry())!=null)
- {
- System.out.println("unziping " + z.getName());
- if (z.isDirectory())
- {
- String name = z.getName();
- name = name.substring(0, name.length() - 1);
- File f = new File(outputDirectory + File.separator + name);
- f.mkdir();
- System.out.println("mkdir " + outputDirectory + File.separator
- + name);
- }
- else
- {
- File f = new File(outputDirectory + File.separator
- + z.getName());
- f.createNewFile();
- System.out.println("f:" +f);
- FileOutputStream out = new FileOutputStream(f);
- int b;
- while ((b = in.read()) != -1)
- out.write(b);
- out.close();
- }
- }
- in.close();
- }
- public void zip(ZipOutputStream out, File f, String base) throws Exception
- {
- System.out.println("Zipping " + f.getName());
- if (f.isDirectory())
- {
- File[] fl = f.listFiles();
- out.putNextEntry(new ZipEntry(base + "/"));
- base = base.length() == 0 ? "" : base + "/";
- for (int i = 0; i < fl.length; i++)
- {
- zip(out, fl[i], base + fl[i].getName());
- }
- }
- else
- {
- out.putNextEntry(new ZipEntry(base));
- FileInputStream in = new FileInputStream(f);
- int b;
- while ((b = in.read()) != -1)
- out.write(b);
- in.close();
- }
- }
- public static void main(String[] args)
- {
- try
- {
- TestZip t = new TestZip();
- t.unzip("D:\\program\\servers\\apache-tomcat-6.0.9\\apache-tomcat-6.0.9\\webapps\\Manage\\xxx.zip", "D:\\program\\servers\\apache-tomcat-6.0.9\\apache-tomcat-6.0.9\\webapps\\Manage\\");
- }
- catch (Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
- }
package com.conngame.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import com.zwl.zip.ZipEntry;
import com.zwl.zip.ZipInputStream;
import com.zwl.zip.ZipOutputStream;
/**
* TestZip.java coding by Serol Luo. [email protected] 2003/07/03
* http://www.chinaunix.net/forum/viewforum.php?f=26 轉載請保留此信息
*/
class TestZip
{
public void zip(String zipFileName, String inputFile) throws Exception
{
zip(zipFileName, new File(inputFile));
}
public void zip(String zipFileName, File inputFile) throws Exception
{
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName));
zip(out, inputFile, "");
System.out.println("zip done");
out.close();
}
public void unzip(String zipFileName, String outputDirectory)
throws Exception
{
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
ZipEntry z;
// System.out.println("z = in.getNextEntry(): "+((z=in.getNextEntry())!=null));
while ((z=in.getNextEntry())!=null)
{
System.out.println("unziping " + z.getName());
if (z.isDirectory())
{
String name = z.getName();
name = name.substring(0, name.length() - 1);
File f = new File(outputDirectory + File.separator + name);
f.mkdir();
System.out.println("mkdir " + outputDirectory + File.separator
+ name);
}
else
{
File f = new File(outputDirectory + File.separator
+ z.getName());
f.createNewFile();
System.out.println("f:" +f);
FileOutputStream out = new FileOutputStream(f);
int b;
while ((b = in.read()) != -1)
out.write(b);
out.close();
}
}
in.close();
}
public void zip(ZipOutputStream out, File f, String base) throws Exception
{
System.out.println("Zipping " + f.getName());
if (f.isDirectory())
{
File[] fl = f.listFiles();
out.putNextEntry(new ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++)
{
zip(out, fl[i], base + fl[i].getName());
}
}
else
{
out.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
while ((b = in.read()) != -1)
out.write(b);
in.close();
}
}
public static void main(String[] args)
{
try
{
TestZip t = new TestZip();
t.unzip("D:\\program\\servers\\apache-tomcat-6.0.9\\apache-tomcat-6.0.9\\webapps\\Manage\\xxx.zip", "D:\\program\\servers\\apache-tomcat-6.0.9\\apache-tomcat-6.0.9\\webapps\\Manage\\");
}
catch (Exception e)
{
e.printStackTrace(System.out);
}
}
}
評論
File f = new File(outputDirectory + File.separator + z.getName());
System.out.println(f.getAbsolutePath());
if(!f.getParentFile().exists()){
f.getParentFile().mkdirs();
}
f.createNewFile();
/*initIDs();*/ 也要註釋掉。
static {
/* Zip library is loaded from System.initializeSystemClass */
/*initIDs();*/
}
轉載: