java 自带的zip包在压缩,解压文件的时候,在路径和文件名存在中文问题的时候出现乱码,查找资料后得知是jdk的原因,要不修改相关的jdk文件,要就就换其他的类库,这里给出利用ant包里面文件的压缩/解压的关键代码:
导入ant.jar包
以下代码在xp jdk1.5测试通过
package com.feng.zipfile;
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.io.InputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* @author feng Jan 30, 2008 1:29:46 PM
*/
public class ZipTest {
static ZipOutputStream zos;
private static final int BUFFER = 2048;
/**
*
*/
public ZipTest() {
// TODO Auto-generated constructor stub
}
/**
* @param args
* Jan 30, 2008 1:29:46 PM
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ZipTest.makeZip("c://test");
ZipTest.unzip("c://test中文.zip", "c://test1122");
System.out.println("dddd");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void makeZip(String filepath) throws IOException,
FileNotFoundException {
File file = new File(filepath);
zos = new ZipOutputStream(new FileOutputStream(file + ".zip"));
recurseFiles(file);
zos.close();
}
/**
* 重复压缩文件
* @param file
* @throws IOException
* @throws FileNotFoundException
* Jan 30, 2008 1:33:52 PM
*/
private static void recurseFiles(File file) throws IOException,
FileNotFoundException {
if (file.isDirectory()) {
String[] fileNames = file.list();
if (fileNames != null) {
for (int i = 0; i < fileNames.length; i++) {
recurseFiles(new File(file, fileNames[i]));
}
}
}
else {
byte[] buf = new byte[BUFFER];
int len;
// 修改为单个文件名称.不带包路径
// ZipEntry zipEntry = new ZipEntry(file.toString());//这个是带文件包和路径的
ZipEntry zipEntry = new ZipEntry(file.getName());
FileInputStream fin = new FileInputStream(file);
BufferedInputStream in = new BufferedInputStream(fin);
zos.putNextEntry(zipEntry);
while ((len = in.read(buf)) >= 0) {
zos.write(buf, 0, len);
}
in.close();
zos.closeEntry();
}
}
/**
* 解压缩zip文件
* @param zipFileName 文件的名称和具体路径
* @param outputDirectory 文件解压后的目录
* @return 成功为真
* Jan 30, 2008 1:00:01 PM
*/
public static boolean unzip(String zipFileName,String outputDirectory){
boolean bn=false;
try {
org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(zipFileName);
java.util.Enumeration e = zipFile.getEntries();
File dir=new File(outputDirectory);
if(!dir.exists())dir.mkdirs();
outputDirectory=dir.toString();
org.apache.tools.zip.ZipEntry zipEntry = null;
while (e.hasMoreElements()){
zipEntry = (org.apache.tools.zip.ZipEntry)e.nextElement();
if (zipEntry.isDirectory()){
String name=zipEntry.getName();
name=name.substring(0,name.length()-1);
File f1=new File(outputDirectory+File.separator);
f1.mkdir();
File f=new File(outputDirectory+File.separator+name);
f.mkdir();
}else{
File f=new File(outputDirectory+File.separator+zipEntry.getName());
f.createNewFile();
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out=new FileOutputStream(f);
int c;
byte[] by=new byte[BUFFER];
while((c=in.read(by)) != -1){
out.write(by,0,c);
}
out.close();
in.close();
}
}
bn=true;
}catch (Exception ex){
ex.printStackTrace();
}
return bn;
}
}
导入ant.jar包
以下代码在xp jdk1.5测试通过
package com.feng.zipfile;
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.io.InputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* @author feng Jan 30, 2008 1:29:46 PM
*/
public class ZipTest {
static ZipOutputStream zos;
private static final int BUFFER = 2048;
/**
*
*/
public ZipTest() {
// TODO Auto-generated constructor stub
}
/**
* @param args
* Jan 30, 2008 1:29:46 PM
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ZipTest.makeZip("c://test");
ZipTest.unzip("c://test中文.zip", "c://test1122");
System.out.println("dddd");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void makeZip(String filepath) throws IOException,
FileNotFoundException {
File file = new File(filepath);
zos = new ZipOutputStream(new FileOutputStream(file + ".zip"));
recurseFiles(file);
zos.close();
}
/**
* 重复压缩文件
* @param file
* @throws IOException
* @throws FileNotFoundException
* Jan 30, 2008 1:33:52 PM
*/
private static void recurseFiles(File file) throws IOException,
FileNotFoundException {
if (file.isDirectory()) {
String[] fileNames = file.list();
if (fileNames != null) {
for (int i = 0; i < fileNames.length; i++) {
recurseFiles(new File(file, fileNames[i]));
}
}
}
else {
byte[] buf = new byte[BUFFER];
int len;
// 修改为单个文件名称.不带包路径
// ZipEntry zipEntry = new ZipEntry(file.toString());//这个是带文件包和路径的
ZipEntry zipEntry = new ZipEntry(file.getName());
FileInputStream fin = new FileInputStream(file);
BufferedInputStream in = new BufferedInputStream(fin);
zos.putNextEntry(zipEntry);
while ((len = in.read(buf)) >= 0) {
zos.write(buf, 0, len);
}
in.close();
zos.closeEntry();
}
}
/**
* 解压缩zip文件
* @param zipFileName 文件的名称和具体路径
* @param outputDirectory 文件解压后的目录
* @return 成功为真
* Jan 30, 2008 1:00:01 PM
*/
public static boolean unzip(String zipFileName,String outputDirectory){
boolean bn=false;
try {
org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(zipFileName);
java.util.Enumeration e = zipFile.getEntries();
File dir=new File(outputDirectory);
if(!dir.exists())dir.mkdirs();
outputDirectory=dir.toString();
org.apache.tools.zip.ZipEntry zipEntry = null;
while (e.hasMoreElements()){
zipEntry = (org.apache.tools.zip.ZipEntry)e.nextElement();
if (zipEntry.isDirectory()){
String name=zipEntry.getName();
name=name.substring(0,name.length()-1);
File f1=new File(outputDirectory+File.separator);
f1.mkdir();
File f=new File(outputDirectory+File.separator+name);
f.mkdir();
}else{
File f=new File(outputDirectory+File.separator+zipEntry.getName());
f.createNewFile();
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out=new FileOutputStream(f);
int c;
byte[] by=new byte[BUFFER];
while((c=in.read(by)) != -1){
out.write(by,0,c);
}
out.close();
in.close();
}
}
bn=true;
}catch (Exception ex){
ex.printStackTrace();
}
return bn;
}
}