1.讀取壓縮文件:ZipInputStream
借助ZipFile類的getInputStream方法得到壓縮文件的指定項的內容,然后傳遞給InputStreamReader類的構造方法,返回給BufferedReader類實例化,從而使得指定項的內容輸出到內存中。
2.壓縮文件:ZipOutputStream
2.1 注意,zipOut.putNextEntry(entry);// 此方法會清空zip文件原來存在的內容,然后寫入文件,並將流定位到條目數據的開始處,直到關閉ZipOutputStream
2.2 必須關閉ZipOutputStream流,若不關閉ZipOutputStream流,則會壓縮錯誤:不可預料的壓縮文件末端
2.3 壓縮文件其實就是,創建一個新的壓縮文件,然后把要壓縮的文件內容寫入到壓縮文件項中。
package com.chinasofti.javase0823.zipInputStreamTest; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipTest { public static void main(String[] args) { readZip(); writeZip(); } /** * 讀取zip文件內容 */ private static void readZip() { File fil = new File("D:\\av\\zip\\zip.zip"); ZipInputStream zipIn = null; try { zipIn = new ZipInputStream(new FileInputStream(fil)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ZipEntry zipEn = null; /** * 需要讀取zip文件項的內容時,需要ZipFile類的對象的getInputStream方法取得該項的內容, * 然后傳遞給InputStreamReader的構造方法創建InputStreamReader對象, * 最后使用此InputStreamReader對象創建BufferedReader實例 * 至此已把zip文件項的內容讀出到緩存中,可以遍歷其內容 */ ZipFile zfil = null; try { zfil = new ZipFile("D:\\av\\zip\\zip.zip"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { while ((zipEn = zipIn.getNextEntry()) != null) { if (!zipEn.isDirectory()) { // 判斷此zip項是否為目錄 System.out.println(zipEn.getName() + ":\t"); /** * 把是文件的zip項讀出緩存, * zfil.getInputStream(zipEn):返回輸入流讀取指定zip文件條目的內容 zfil:new * ZipFile();供閱讀的zip文件 zipEn:zip文件中的某一項 */ BufferedReader buff = new BufferedReader( new InputStreamReader(zfil.getInputStream(zipEn))); String str; while ((str = buff.readLine()) != null) { System.out.println("\t" + str); } buff.close(); } zipIn.closeEntry();// 關閉當前打開的項 } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { zfil.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 壓縮文件 * 創建壓縮文件 * 若該文件本來就存在文件則清空,然后寫入,直到關閉ZipOutputStream * 即從ZipOutputStream實例化到關閉期間寫入的文件不會清空 * 若不關閉ZipOutputStream流,則會壓縮錯誤:不可預料的壓縮文件末端 * * 壓縮文件夾可以循環其內文件再讀取其數據,再壓縮文件 * */ private static void writeZip() { ZipOutputStream zipOut = null; try { zipOut = new ZipOutputStream(new FileOutputStream("D:\\av\\zip\\zip1.zip"));//若文件不存在則創建 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } int i=0; while (i<3) { ZipEntry entry = new ZipEntry(i+".txt"); try { zipOut.putNextEntry(entry);// 此方法會清空zip文件原來存在的內容,然后創建新的文件1.txt,並將流定位到條目數據的開始處 zipOut.write(98); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } i++; } try { zipOut.close();//必須關閉,否則壓縮文件錯誤:不可預料的壓縮文件末端 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
