Java如何實現壓縮文件與解壓縮zip文件
Java壓縮文件與解壓縮zip文件
在日常的使用中經常會使用到像WinRAR或WinZIP這樣的壓縮文件,通過這些軟件可以把一個很大的文件進行壓縮以方便傳輸。
在JAVA中 為瞭減少傳輸時的數據量也提供瞭專門的壓縮流,可以將文件或文件夾壓縮成ZIP、JAR、GZIP等文件的格式。
ZIP是一種較為常見的壓縮形式,在Java中要想實現ZIP的壓縮需要導入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry幾個類完成。
testZip
package com.kuang.zip; import org.apache.commons.io.IOUtils; import java.io.*; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class testZip { public static void unZipIt(String file, String outputFolder) throws IOException { ZipFile zipFile = null; InputStream in=null; OutputStream out=null; try { zipFile = new ZipFile(file); Enumeration <? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); File entryDestination = new File(outputFolder, entry.getName()); if (entry.isDirectory()) { entryDestination.mkdirs(); } else { entryDestination.getParentFile().mkdirs(); try { out = new FileOutputStream(entryDestination); in = zipFile.getInputStream(entry); IOUtils.copy(in, out); } catch (IOException e) { throw e; }finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); } } } } finally { try { if(zipFile!=null){zipFile.close();zipFile=null;} } catch (IOException e) { } } } public static void main(String[] args) throws Exception { unZipIt("D:\\Test\\TestbyYTT.zip","D:\\Test\\"); } }
org.apache.commons.io.IOUtils需引入maven依賴
<!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
org.apache.commons.io.IOUtils.closeQuietly()隻是確保流會被關閉,無論流是否正常結束,看源碼發現closeQuietly它會忽略異常
那麼為什麼IOUtils.closeQuietly()會在2.6的時候將它標記為過時呢?
因為Java7裡的try-with-resource
語法糖的出現,之前定義在try catch外部的流移到瞭try後邊的括號裡,不再需要手動關閉瞭,它會自行處理。
public static void readAll() { try ( FileReader fileReader = new FileReader("test"); BufferedReader bufferedReader = new BufferedReader(fileReader) ) { String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } }
拓展:還有一種語法叫multi-catch
可以簡化多個catch
FileZip
package com.kuang.zip; import java.io.*; import java.util.zip.*; import java.util.zip.ZipEntry; public class FileZip { /** * zip文件壓縮 * @param inputFile 待壓縮文件夾/文件名 * @param outputFile 生成的壓縮包名字 */ public static void ZipCompress(String inputFile, String outputFile) throws Exception { //創建zip輸出流 ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFile)); //創建緩沖輸出流 BufferedOutputStream bos = new BufferedOutputStream(out); File input = new File(inputFile); compress(out, bos, input,null); bos.close(); out.close(); } /** * @param name 壓縮文件名,可以寫為null保持默認 */ //遞歸壓縮 public static void compress(ZipOutputStream out, BufferedOutputStream bos, File input, String name) throws IOException { if (name == null) { name = input.getName(); } //如果路徑為目錄(文件夾) if (input.isDirectory()) { //取出文件夾中的文件(或子文件夾) File[] flist = input.listFiles(); if (flist.length == 0)//如果文件夾為空,則隻需在目的地zip文件中寫入一個目錄進入 { out.putNextEntry(new ZipEntry(name + "/")); } else//如果文件夾不為空,則遞歸調用compress,文件夾中的每一個文件(或文件夾)進行壓縮 { for (int i = 0; i < flist.length; i++) { compress(out, bos, flist[i], name + "/" + flist[i].getName()); } } } else//如果不是目錄(文件夾),即為文件,則先寫入目錄進入點,之後將文件寫入zip文件中 { out.putNextEntry(new ZipEntry(name)); FileInputStream fos = new FileInputStream(input); BufferedInputStream bis = new BufferedInputStream(fos); int len=-1; //將源文件寫入到zip文件中 byte[] buf = new byte[1024]; while ((len = bis.read(buf)) != -1) { bos.write(buf,0,len); } bis.close(); fos.close(); } } /** * zip解壓 * @param inputFile 待解壓文件名 * @param destDirPath 解壓路徑 */ public static void ZipUncompress(String inputFile,String destDirPath) throws Exception { File srcFile = new File(inputFile);//獲取當前壓縮文件 // 判斷源文件是否存在 if (!srcFile.exists()) { throw new Exception(srcFile.getPath() + "所指文件不存在"); } //開始解壓 //構建解壓輸入流 ZipInputStream zIn = new ZipInputStream(new FileInputStream(srcFile)); ZipEntry entry = null; File file = null; while ((entry = zIn.getNextEntry()) != null) { if (!entry.isDirectory()) { file = new File(destDirPath, entry.getName()); if (!file.exists()) { new File(file.getParent()).mkdirs();//創建此文件的上級目錄 } OutputStream out = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(out); int len = -1; byte[] buf = new byte[1024]; while ((len = zIn.read(buf)) != -1) { bos.write(buf, 0, len); } // 關流順序,先打開的後關閉 bos.close(); out.close(); } } } public static void main(String[] args) { try { ZipCompress("D:\\Test", "D:\\Test\\TestbyYTT.zip"); ZipUncompress("D:\\Test\\TestbyYTT.zip","D:\\Test\\TestbyYTT的解壓文件"); } catch (Exception e) { e.printStackTrace(); } } }
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Java實現把文件壓縮成zip文件的示例代碼
- Java實現解析zip壓縮包並獲取文件內容
- 手把手教你用SpringBoot將文件打包成zip存放或導出
- c# 用ICSharpCode組件壓縮文件
- java 文件流的處理方式 文件打包成zip