目錄進入點是文件在壓縮文件中的映射,表明壓縮文件。壓縮文件時,建立目錄進入點,將文件寫入該目錄進入點。解壓時,獲取目錄進入點,將該目錄進入點的內容寫入硬盤指定文件。java
若是目錄進入點是一個文件夾,在命名時必須以路徑分隔符結尾,在Window操做系統中名稱分隔符爲「/」。spa
不管是調用createNewFile()建立文件,仍是在建立輸出流時由輸出流負責建立文件,都必須保證父路徑已經存在,不然文件沒法建立。操作系統
首先爲文件或者文件夾建立目錄進入點,目錄進入點的名稱爲當前文件相對於壓縮文件的路徑,文件夾的目錄進入點名稱必須以名稱分隔符結尾,以區別於文件。3d
ZipEntry entry = new ZipEntry(壓縮文件夾名稱 + File.separator+文件或文件夾路徑);
使用ZipOutputStream輸出流將文件寫入對應目錄進入點中,寫入完成,關閉目錄進入點。code
package com.javase.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipUtils { /** * 壓縮一個文件夾 * * @throws IOException */ public void zipDirectory(String path) throws IOException { File file = new File(path); String parent = file.getParent(); File zipFile = new File(parent, file.getName() + ".zip"); ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile)); zip(zos, file, file.getName()); zos.flush(); zos.close(); } /** * * @param zos * 壓縮輸出流 * @param file * 當前須要壓縮的文件 * @param path * 當前文件相對於壓縮文件夾的路徑 * @throws IOException */ private void zip(ZipOutputStream zos, File file, String path) throws IOException { // 首先判斷是文件,仍是文件夾,文件直接寫入目錄進入點,文件夾則遍歷 if (file.isDirectory()) { ZipEntry entry = new ZipEntry(path + File.separator);// 文件夾的目錄進入點必須以名稱分隔符結尾 zos.putNextEntry(entry); File[] files = file.listFiles(); for (File x : files) { zip(zos, x, path + File.separator + x.getName()); } } else { FileInputStream fis = new FileInputStream(file);// 目錄進入點的名字是文件在壓縮文件中的路徑 ZipEntry entry = new ZipEntry(path); zos.putNextEntry(entry);// 創建一個目錄進入點 int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { zos.write(buf, 0, len); } zos.flush(); fis.close(); zos.closeEntry();// 關閉當前目錄進入點,將輸入流移動下一個目錄進入點 } } }
解壓文件時,先獲取壓縮文件中的目錄進入點,根據該目錄進入點建立文件對象,將目錄進入點的內容寫入硬盤文件中。對象
package com.javase.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipUtils {private String basePath; /** * 解壓文件 * * @param unzip * @throws IOException */ public void unzip(String unzip) throws IOException { File file = new File(unzip); basePath = file.getParent(); FileInputStream fis = new FileInputStream(file); ZipInputStream zis = new ZipInputStream(fis); unzip(zis); } private void unzip(ZipInputStream zis) throws IOException { ZipEntry entry = zis.getNextEntry(); if (entry != null) { File file = new File(basePath + File.separator + entry.getName()); if (file.isDirectory()) { // 可能存在空文件夾 if (!file.exists()) file.mkdirs(); unzip(zis); } else { File parentFile = file.getParentFile(); if (parentFile != null && !parentFile.exists()) parentFile.mkdirs(); FileOutputStream fos = new FileOutputStream(file);// 輸出流建立文件時必須保證父路徑存在 int len = 0; byte[] buf = new byte[1024]; while ((len = zis.read(buf)) != -1) { fos.write(buf, 0, len); } fos.flush(); fos.close(); zis.closeEntry(); unzip(zis); } } } }