posts - 33,  comments - 17,  trackbacks - 0
  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 阅读(299) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2008年7月>
日一二三四五六
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(1)

随笔分类

随笔档案

PL/SQL存储过程与函数

搜索

  •  

最新评论

阅读排行榜

评论排行榜