用java好久了,还没有写个压缩文件的示例,昨晚弄了下,把写下来,以后可以看。
关系到
java.util.zip.ZipEntry
java.util.zip.ZipOutputStream
如果要解决中文文件名问题,用到ant.jar
这两个类。
package
net.blogjava.chenlb.zip;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
// import java.util.zip.ZipEntry;
// import java.util.zip.ZipOutputStream;
// 用ant.jar的zip.*可以解决中文文件名问题
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* 压缩文件.
* 2007-10-17 下午11:19:50
* @author chenlb
*/
public class RecursiveZip {
public static void main(String[] args) {
RecursiveZip recursiveZip = new RecursiveZip();
System.out.println( " ====开始==== " );
try {
OutputStream os = new FileOutputStream( " e:/doc-recursive.zip " );
BufferedOutputStream bs = new BufferedOutputStream(os);
ZipOutputStream zo = new ZipOutputStream(bs);
// recursiveZip.zip("e:/recursive-zip/中文文件名.txt", new File("e:/recursive-zip"), zo, true, true);
recursiveZip.zip( " e:/recursive-zip " , new File( " e:/recursive-zip " ), zo, true , true );
zo.closeEntry();
zo.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println( " ====完成==== " );
}
/**
* @param path 要压缩的路径, 可以是目录, 也可以是文件.
* @param basePath 如果path是目录,它一般为new File(path), 作用是:使输出的zip文件以此目录为根目录, 如果为null它只压缩文件, 不解压目录.
* @param zo 压缩输出流
* @param isRecursive 是否递归
* @param isOutBlankDir 是否输出空目录, 要使输出空目录为true,同时baseFile不为null.
* @throws IOException
*/
public void zip(String path, File basePath, ZipOutputStream zo, boolean isRecursive, boolean isOutBlankDir) throws IOException {
File inFile = new File(path);
File[] files = new File[ 0 ];
if (inFile.isDirectory()) { // 是目录
files = inFile.listFiles();
} else if (inFile.isFile()) { // 是文件
files = new File[ 1 ];
files[ 0 ] = inFile;
}
byte [] buf = new byte [ 1024 ];
int len;
// System.out.println("baseFile: "+baseFile.getPath());
for ( int i = 0 ; i < files.length; i ++ ) {
String pathName = "" ;
if (basePath != null ) {
if (basePath.isDirectory()) {
pathName = files[i].getPath().substring(basePath.getPath().length() + 1 );
} else { // 文件
pathName = files[i].getPath().substring(basePath.getParent().length() + 1 );
}
} else {
pathName = files[i].getName();
}
System.out.println(pathName);
if (files[i].isDirectory()) {
if (isOutBlankDir && basePath != null ) {
zo.putNextEntry( new ZipEntry(pathName + " / " )); // 可以使空目录也放进去
}
if (isRecursive) { // 递归
zip(files[i].getPath(), basePath, zo, isRecursive, isOutBlankDir);
}
} else {
FileInputStream fin = new FileInputStream(files[i]);
zo.putNextEntry( new ZipEntry(pathName));
while ((len = fin.read(buf)) > 0 ) {
zo.write(buf, 0 ,len);
}
fin.close();
}
}
}
}
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
// import java.util.zip.ZipEntry;
// import java.util.zip.ZipOutputStream;
// 用ant.jar的zip.*可以解决中文文件名问题
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* 压缩文件.
* 2007-10-17 下午11:19:50
* @author chenlb
*/
public class RecursiveZip {
public static void main(String[] args) {
RecursiveZip recursiveZip = new RecursiveZip();
System.out.println( " ====开始==== " );
try {
OutputStream os = new FileOutputStream( " e:/doc-recursive.zip " );
BufferedOutputStream bs = new BufferedOutputStream(os);
ZipOutputStream zo = new ZipOutputStream(bs);
// recursiveZip.zip("e:/recursive-zip/中文文件名.txt", new File("e:/recursive-zip"), zo, true, true);
recursiveZip.zip( " e:/recursive-zip " , new File( " e:/recursive-zip " ), zo, true , true );
zo.closeEntry();
zo.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println( " ====完成==== " );
}
/**
* @param path 要压缩的路径, 可以是目录, 也可以是文件.
* @param basePath 如果path是目录,它一般为new File(path), 作用是:使输出的zip文件以此目录为根目录, 如果为null它只压缩文件, 不解压目录.
* @param zo 压缩输出流
* @param isRecursive 是否递归
* @param isOutBlankDir 是否输出空目录, 要使输出空目录为true,同时baseFile不为null.
* @throws IOException
*/
public void zip(String path, File basePath, ZipOutputStream zo, boolean isRecursive, boolean isOutBlankDir) throws IOException {
File inFile = new File(path);
File[] files = new File[ 0 ];
if (inFile.isDirectory()) { // 是目录
files = inFile.listFiles();
} else if (inFile.isFile()) { // 是文件
files = new File[ 1 ];
files[ 0 ] = inFile;
}
byte [] buf = new byte [ 1024 ];
int len;
// System.out.println("baseFile: "+baseFile.getPath());
for ( int i = 0 ; i < files.length; i ++ ) {
String pathName = "" ;
if (basePath != null ) {
if (basePath.isDirectory()) {
pathName = files[i].getPath().substring(basePath.getPath().length() + 1 );
} else { // 文件
pathName = files[i].getPath().substring(basePath.getParent().length() + 1 );
}
} else {
pathName = files[i].getName();
}
System.out.println(pathName);
if (files[i].isDirectory()) {
if (isOutBlankDir && basePath != null ) {
zo.putNextEntry( new ZipEntry(pathName + " / " )); // 可以使空目录也放进去
}
if (isRecursive) { // 递归
zip(files[i].getPath(), basePath, zo, isRecursive, isOutBlankDir);
}
} else {
FileInputStream fin = new FileInputStream(files[i]);
zo.putNextEntry( new ZipEntry(pathName));
while ((len = fin.read(buf)) > 0 ) {
zo.write(buf, 0 ,len);
}
fin.close();
}
}
}
}