用java好久了,还没有写个压缩文件的示例,昨晚弄了下,把写下来,以后可以看。
关系到
java.util.zip.ZipEntry
java.util.zip.ZipOutputStream
如果要解决中文文件名问题,用到ant.jar
这两个类。
ZipOutputStream.putNextEntry(ZipEntry);就可以了,然后ZipOutputStream.wirte();就得了。
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();
}
}
}
}