| 利用JAVA API函數實(shí)現數據的壓縮與解壓縮(2) | ||
| http://www.51cto.com 2005-10-11 00:00 作者:夏治(Tim) 出處:51cto.com | ||
| ||
| 例程1源代碼: UnZip.java import java.io.*; import java.util.zip.*; public class UnZip { static final int BUFFER = 2048; public static void main (String argv[]) { try { BufferedOutputStream dest = null; FileInputStream fis = new FileInputStream(argv[0]); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); ZipEntry entry; while((entry = zis.getNextEntry()) != null) { System.out.println("Extracting: " +entry); int count; byte data[] = new byte[BUFFER]; // write the files to the disk FileOutputStream fos = new FileOutputStream(entry.getName()); dest = new BufferedOutputStream(fos, BUFFER); while ((count = zis.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); } zis.close(); } catch(Exception e) { e.printStackTrace(); }} } 有一點(diǎn)值得大家注意,類(lèi)ZipInputStream讀出ZIP文件序列(簡(jiǎn)單地說(shuō)就是讀出這個(gè)ZIP文件壓縮了多少文件),而類(lèi)ZipFile使用內嵌的隨機文件訪(fǎng)問(wèn)機制讀出其中的文件內容,所以不必順序的讀出ZIP壓縮文件序列。 注意:ZIPInputStream和ZipFile之間另外一個(gè)基本的不同點(diǎn)在于高速緩沖的使用方面。當文件使用ZipInputStream和FileInputStream流讀出的時(shí)候,ZIP條目不使用高速緩沖。然而,如果使用ZipFile(文件名)來(lái)打開(kāi)文件,它將使用內嵌的高速緩沖,所以如果ZipFile(文件名)被重復調用的話(huà),文件只被打開(kāi)一次。緩沖值在第二次打開(kāi)進(jìn)使用。如果你工作在UNIX系統下,這是什么作用都沒(méi)有的,因為使用ZipFile打開(kāi)的所有ZIP文件都在內存中存在映射,所以使用ZipFile的性能優(yōu)于ZipInputStream。然而,如果同一ZIP文件的內容在程序執行期間經(jīng)常改變,或是重載的話(huà),使用ZipInputStream就成為你的首選了。 下面顯示了使用類(lèi)ZipFile來(lái)解壓一個(gè)ZIP文件的過(guò)程: 通過(guò)指定一個(gè)被讀取的ZIP文件,或者是文件名,或者是一個(gè)文件對象來(lái)創(chuàng )建一個(gè)ZipFile對象: ZipFile zipfile = new ZipFile("figs.zip"); 使用entries方法,返回一個(gè)枚舉對象,循環(huán)獲得文件的ZIP條目對象: while(e.hasMoreElements()) { entry = (ZipEntry) e.nextElement(); // read contents and save them } ZIP條目作為參數傳遞給getInputStream方法,可以讀取ZIP文件中指定條目的內容,能過(guò)其返回的輸入流(InputStram)對象可以方便的讀出ZIP條目的內容: is = new BufferedInputStream(zipfile.getInputStream(entry)); 獲取ZIP條目的文件名,創(chuàng )建輸出流,并保存: byte data[] = new byte[BUFFER]; FileOutputStream fos = new FileOutputStream(entry.getName()); dest = new BufferedOutputStream(fos, BUFFER); while ((count = is.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } 最后關(guān)閉所有的輸入輸出流 dest.flush(); dest.close(); is.close(); 完整的程序代碼如例程2所示。再次編譯這個(gè)文件,并傳遞一個(gè)ZIP格式的文件做為參數: prompt> java UnZip2 somefile.zip 例程2源碼: UnZip2.java import java.io.*; import java.util.*; import java.util.zip.*; public class UnZip2 { static final int BUFFER = 2048; public static void main (String argv[]) { try { BufferedOutputStream dest = null; BufferedInputStream is = null; ZipEntry entry; ZipFile zipfile = new ZipFile(argv[0]); Enumeration e = zipfile.entries(); while(e.hasMoreElements()) { entry = (ZipEntry) e.nextElement(); System.out.println("Extracting: " +entry); is = new BufferedInputStream (zipfile.getInputStream(entry)); int count; byte data[] = new byte[BUFFER]; FileOutputStream fos = new FileOutputStream(entry.getName()); dest = new BufferedOutputStream(fos, BUFFER); while ((count = is.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); is.close(); } } catch(Exception e) { e.printStackTrace(); }} } | ||
聯(lián)系客服