1// 一个压缩解压缩文件和目录的完整程序.
2// 版权没有, 随便使用.
3package cross.pauliuyou.tool.io;
4
5import java.io.*;
6import java.util.*;
7import java.util.zip.*;
8
9
10public class ZipUtil
11{
12public static int bufsize = 8192;
13private String zipBase;
14
15private int maxFileNameLength;
16private long totalLength;
17private long bytesHandled;
18
19private String getSpace(int num)
20{
21String space = "";
22for (int i = 0; i < num; i++)
23{
24space += " ";
25}
26return space;
27}
28private void getLength(File path)
29{
30if (path.isFile())
31{
32totalLength += path.length();
33if (path.getPath().length() > maxFileNameLength)
34{
35maxFileNameLength = path.getPath().length();
36}
37}
38else
39{
40File [] fs = path.listFiles();
41for (int i = 0; i < fs.length; i++)
42{
43getLength(fs[i]);
44}
45}
46}
47
48private String lengthString(long fileLength)
49{
50long newValue = 0;
51String size = null;
52if (fileLength < 1024) {
53size = fileLength + " B";
54} else if (fileLength < (1024 * 1024)) {
55newValue = fileLength / 1024;
56size = newValue + " KB";
57} else if (fileLength < (1024 * 1024 * 1024)) {
58newValue = fileLength / (1024 * 1024);
59size = newValue + " MB";
60} else {
61newValue = fileLength / (1024 * 1024 * 1024);
62size = newValue + " GB";
63}
64return size;
65}
66public void zip(String path) throws Exception
67{
68zip(path,null);
69}
70public void zip(String path,String dest) throws Exception
71{
72File f = new File(path);
73if (!f.exists())
74{
75System.out.println("File : " + path + " Not Exists!");
76return;
77}
78getLength(f);
79
80System.out.println("total " + lengthString(totalLength) + " to zip");
81String path2 = "";
82for (int i = 0; i < path.length(); i++)
83{
84char c = path.charAt(i);
85if (c == '\\')
86{
87c = '/';
88}
89path2 += c;
90}
91path = path2;
92
93zipBase = path.substring(path.lastIndexOf("/") == -1 ? 0 : path.lastIndexOf("/") + 1);
94if (dest == null)
95{
96if (f.isFile())
97{
98if (dest == null)
99{
100zipBase = "./";
101dest = path.substring(0,(path.lastIndexOf(".") == -1 ? path.length() : path.lastIndexOf("."))) + ".zip";
102}
103}
104else
105{
106path2 = path.substring(0,path.lastIndexOf("/") == -1 ? path.length() : path.lastIndexOf("/"));
107if (path.equals(path2))
108{
109dest = ".";
110}
111dest = path2 + "/" + zipBase.substring(0,(zipBase.lastIndexOf(".") == -1 ? zipBase.length() : zipBase.lastIndexOf("."))) + ".zip";
112}
113}
114ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(dest));
115zipFile(f,zipOut);
116zipOut.close();
117System.out.print("\r100%\t");
118System.out.println(path + " has been compressed to zip file : " + dest + getSpace(40));
119}
120
121public void zipFile(File f,ZipOutputStream zipOut) throws Exception
122{
123if (f.isDirectory())
124{
125File [] fs = f.listFiles();
126for (int i = 0; i < fs.length; i++)
127{
128zipFile(fs[i],zipOut);
129}
130}
131else
132{
133String path = f.getPath();
134FileInputStream fileIn = new FileInputStream(path);
135String entryName = path;
136int basePos = path.indexOf(zipBase);
137if (basePos > 0)
138{
139entryName = path.substring(basePos);
140}
141ZipEntry theEntry = new ZipEntry(entryName);
142theEntry.setSize(f.length());
143
144zipOut.putNextEntry(theEntry);
145
146byte[] buffer = new byte[bufsize];
147int bytesRead = fileIn.read(buffer,0,bufsize);
148bytesHandled += bytesRead;
149
150while (bytesRead > 0)
151{
152zipOut.write(buffer,0,bytesRead);
153bytesRead = fileIn.read(buffer,0,bufsize);
154bytesHandled += bytesRead;
155int percent = (int)(((double)bytesHandled / totalLength) * 100 );
156System.out.print("\r" + percent + "% ");
157if (totalLength > 1024 * 1024 * 80)
158{
159int j;
160for (j = 0; j < percent % 4 + 1; j++)
161{
162System.out.print(">");
163
164}
165for (int x = 0; x < 4 - j; x++)
166{
167System.out.print(" ");
168}
169}
170System.out.print(" Compress File " + path + getSpace(maxFileNameLength - path.length()));
171}
172fileIn.close();
173zipOut.closeEntry();
174}
175}
176
177public void unzip(String zipFileName) throws Exception
178{
179unzip(zipFileName,null);
180}
181
182public void unzip(String zipFileName,String dest) throws Exception
183{
184File f = new File(zipFileName);
185if (!f.exists())
186{
187System.out.println("Zip File : " + zipFileName + " Not Exists!");
188return;
189}
190
191byte[] buffer = new byte[bufsize];
192
193ZipFile zf = new ZipFile(zipFileName);
194
195ZipEntry theEntry = null;
196
197Enumeration enumer = zf.entries();
198while (enumer.hasMoreElements())
199{
200theEntry = (ZipEntry)enumer.nextElement();
201totalLength += theEntry.getSize();
202if (theEntry.getName().length() > maxFileNameLength)
203{
204maxFileNameLength = theEntry.getName().length();
205}
206}
207
208System.out.println("Zip File " + lengthString(f.length()) + " and Total " + lengthString(totalLength) + " Data to unzip");
209
210enumer = zf.entries();
211while (enumer.hasMoreElements())
212{
213theEntry = (ZipEntry)enumer.nextElement();
214String entryName = theEntry.getName();
215String entryName2 = "";
216for (int i = 0; i < entryName.length(); i++)
217{
218char c = entryName.charAt(i);
219if (c == '\\')
220{
221c = '/';
222}
223entryName2 += c;
224}
225entryName = entryName2;
226zipBase = ".";
227if (dest != null)
228{
229if (dest.endsWith("/"))
230{
231dest = dest.substring(0,dest.length() - 1);
232}
233zipBase = dest;
234}
235String tmpFolder = zipBase;
236
237int begin = 0;
238int end = 0;
239while (true)
240{
241end = entryName.indexOf("/",begin);
242if (end == -1)
243{
244break;
245}
246tmpFolder += "/" + entryName.substring(begin,end);
247begin = end + 1;
248f = new File(tmpFolder);
249if (!f.exists())
250{
251f.mkdir();
252}
253}
254OutputStream os = new FileOutputStream(zipBase + "/" + entryName);
255InputStream is = zf.getInputStream(theEntry);
256int bytesRead = is.read(buffer,0,bufsize);
257bytesHandled += bytesRead;
258while (bytesRead > 0)
259{
260os.write(buffer,0,bytesRead);
261bytesRead = is.read(buffer,0,bufsize);
262bytesHandled += bytesRead;
263System.out.print("\r");
264int percent = (int)(((double)bytesHandled / totalLength) * 100 );
265System.out.print("\r" + percent + "% ");
266if (totalLength > 1024 * 1024 * 80)
267{
268int j;
269for (j = 0; j < percent % 4 + 1; j++)
270{
271System.out.print(">");
272
273}
274for (int x = 0; x < 4 - j; x++)
275{
276System.out.print(" ");
277}
278}
279
280System.out.print(" Unzip File " + entryName + getSpace(maxFileNameLength - entryName.length()));
281}
282is.close();
283os.close();
284}
285
286System.out.println("\r100% Zip File : " + zipFileName + " has been unCompressed to " + dest + "/ !" + getSpace(40));
287}
288
289public static void main(String []args) throws Exception
290{
291if (args.length < 2)
292{
293System.out.println("usage : java cross.pauliuyou.tool.io.ZipUtil -zip[-unzip] filename");
294return;
295}
296ZipUtil zip = new ZipUtil();
297String dest = null;
298if (args[0].equals("-zip"))
299{
300if (args.length > 2)
301{
302dest = args[2];
303}
304zip.zip(args[1],dest);
305}
306if (args[0].equals("-unzip"))
307{
308if (args.length > 2)
309{
310dest = args[2];
311}
312zip.unzip(args[1],dest);
313}
314}
315}
posted on 2008-07-23 17:57
scea2009 阅读(250)
评论(0) 编辑 收藏