JAVA实现压缩/解压缩zip文件

1.import java.io.BufferedInputStream;   
2.import java.io.BufferedOutputStream;
3.import java.io.File;
4.import java.io.FileInputStream;
5.import java.io.FileOutputStream;
6.import java.io.IOException;
7.import java.io.InputStream;
8.import java.io.OutputStream;
9.import java.util.ArrayList;
10.import java.util.Enumeration;
11.import java.util.List;
12.import java.util.zip.ZipEntry;
13.import java.util.zip.ZipFile;
14.import java.util.zip.ZipOutputStream;
15.
16.public class ZipToFile {
17.
18. public static final String ZIP_FILENAME = "C:\\XJPDA.zip";//需要解压缩的文件名
19. public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹
20. public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录
21. public static final int BUFFER = 1024 ;//缓存大小
22.
23. /**
24. * zip压缩功能.
25. * 压缩baseDir(文件夹目录)下所有文件,包括子目录
26. * @throws Exception
27. */
28. public static void zipFile(String baseDir,String fileName) throws Exception{
29. List fileList=getSubFiles(new File(baseDir));
30. ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));
31. ZipEntry ze=null;
32. byte[] buf=new byte[BUFFER];
33. int readLen=0;
34. for(int i = 0; i <fileList.size(); i++) {
35. File f=(File)fileList.get(i);
36. ze=new ZipEntry(getAbsFileName(baseDir, f));
37. ze.setSize(f.length());
38. ze.setTime(f.lastModified());
39. zos.putNextEntry(ze);
40. InputStream is=new BufferedInputStream(new FileInputStream(f));
41. while ((readLen=is.read(buf, 0, BUFFER))!=-1) {
42. zos.write(buf, 0, readLen);
43. }
44. is.close();
45. }
46. zos.close();
47. }
48.
49. /**
50. * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
51. * @param baseDir java.lang.String 根目录
52. * @param realFileName java.io.File 实际的文件名
53. * @return 相对文件名
54. */
55. private static String getAbsFileName(String baseDir, File realFileName){
56. File real=realFileName;
57. File base=new File(baseDir);
58. String ret=real.getName();
59. while (true) {
60. real=real.getParentFile();
61. if(real==null)
62. break;
63. if(real.equals(base))
64. break;
65. else
66. ret=real.getName()+"/"+ret;
67. }
68. return ret;
69. }
70.
71. /**
72. * 取得指定目录下的所有文件列表,包括子目录.
73. * @param baseDir File 指定的目录
74. * @return 包含java.io.File的List
75. */
76. private static List getSubFiles(File baseDir){
77. List ret=new ArrayList();
78. File[] tmp=baseDir.listFiles();
79. for (int i = 0; i <tmp.length; i++) {
80. if(tmp[i].isFile())
81. ret.add(tmp[i]);
82. if(tmp[i].isDirectory())
83. ret.addAll(getSubFiles(tmp[i]));
84. }
85. return ret;
86. }
87.
88. /**
89. * 解压缩功能.
90. * 将ZIP_FILENAME文件解压到ZIP_DIR目录下.
91. * @throws Exception
92. */
93. public static void upZipFile() throws Exception{
94. ZipFile zfile=new ZipFile(ZIP_FILENAME);
95. Enumeration zList=zfile.entries();
96. ZipEntry ze=null;
97. byte[] buf=new byte[1024];
98. while(zList.hasMoreElements()){
99. ze=(ZipEntry)zList.nextElement();
100. if(ze.isDirectory()){
101. File f=new File(ZIP_DIR+ze.getName());
102. f.mkdir();
103. continue;
104. }
105. OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));
106. InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
107. int readLen=0;
108. while ((readLen=is.read(buf, 0, 1024))!=-1) {
109. os.write(buf, 0, readLen);
110. }
111. is.close();
112. os.close();
113. }
114. zfile.close();
115. }
116.
117. /**
118. * 给定根目录,返回一个相对路径所对应的实际文件名.
119. * @param baseDir 指定根目录
120. * @param absFileName 相对路径名,来自于ZipEntry中的name
121. * @return java.io.File 实际的文件
122. */
123. public static File getRealFileName(String baseDir, String absFileName){
124. String[] dirs=absFileName.split("/");
125. File ret=new File(baseDir);
126. if(dirs.length>1){
127. for (int i = 0; i < dirs.length-1;i++) {
128. ret=new File(ret, dirs[i]);
129. }
130. if(!ret.exists())
131. ret.mkdirs();
132. ret=new File(ret, dirs[dirs.length-1]);
133. return ret;
134. }
135. return ret;
136. }
137.
138.}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipToFile {

public static final String ZIP_FILENAME = "C:\\XJPDA.zip";//需要解压缩的文件名
public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹
public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录
public static final int BUFFER = 1024 ;//缓存大小

/**
* zip压缩功能.
* 压缩baseDir(文件夹目录)下所有文件,包括子目录
* @throws Exception
*/
public static void zipFile(String baseDir,String fileName) throws Exception{
List fileList=getSubFiles(new File(baseDir));
ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));
ZipEntry ze=null;
byte[] buf=new byte[BUFFER];
int readLen=0;
for(int i = 0; i <fileList.size(); i++) {
File f=(File)fileList.get(i);
ze=new ZipEntry(getAbsFileName(baseDir, f));
ze.setSize(f.length());
ze.setTime(f.lastModified());
zos.putNextEntry(ze);
InputStream is=new BufferedInputStream(new FileInputStream(f));
while ((readLen=is.read(buf, 0, BUFFER))!=-1) {
zos.write(buf, 0, readLen);
}
is.close();
}
zos.close();
}

/**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
* @param baseDir java.lang.String 根目录
* @param realFileName java.io.File 实际的文件名
* @return 相对文件名
*/
private static String getAbsFileName(String baseDir, File realFileName){
File real=realFileName;
File base=new File(baseDir);
String ret=real.getName();
while (true) {
real=real.getParentFile();
if(real==null)
break;
if(real.equals(base))
break;
else
ret=real.getName()+"/"+ret;
}
return ret;
}

/**
* 取得指定目录下的所有文件列表,包括子目录.
* @param baseDir File 指定的目录
* @return 包含java.io.File的List
*/
private static List getSubFiles(File baseDir){
List ret=new ArrayList();
File[] tmp=baseDir.listFiles();
for (int i = 0; i <tmp.length; i++) {
if(tmp[i].isFile())
ret.add(tmp[i]);
if(tmp[i].isDirectory())
ret.addAll(getSubFiles(tmp[i]));
}
return ret;
}

/**
* 解压缩功能.
* 将ZIP_FILENAME文件解压到ZIP_DIR目录下.
* @throws Exception
*/
public static void upZipFile() throws Exception{
ZipFile zfile=new ZipFile(ZIP_FILENAME);
Enumeration zList=zfile.entries();
ZipEntry ze=null;
byte[] buf=new byte[1024];
while(zList.hasMoreElements()){
ze=(ZipEntry)zList.nextElement();
if(ze.isDirectory()){
File f=new File(ZIP_DIR+ze.getName());
f.mkdir();
continue;
}
OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));
InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
int readLen=0;
while ((readLen=is.read(buf, 0, 1024))!=-1) {
os.write(buf, 0, readLen);
}
is.close();
os.close();
}
zfile.close();
}

/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
* @param baseDir 指定根目录
* @param absFileName 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
*/
public static File getRealFileName(String baseDir, String absFileName){
String[] dirs=absFileName.split("/");
File ret=new File(baseDir);
if(dirs.length>1){
for (int i = 0; i < dirs.length-1;i++) {
ret=new File(ret, dirs[i]);
}
if(!ret.exists())
ret.mkdirs();
ret=new File(ret, dirs[dirs.length-1]);
return ret;
}
return ret;
}

}

不过上面存在中文问题
是因为java.util.zip下的格式转换有问题

import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
改成
import org.apache.tools.zip.*;
即可!
apache里修正了这一现象。
原文地址:http://orz.iteye.com/blog/110842
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值