在開發過程中,有時需要對檔案進行一個壓縮操作,以節省硬碟空間,那麼用Java怎麼實現檔案的壓縮與解壓縮呢?很簡單,Java為我們提供了一個包,專門負責文件的壓縮與解壓的,那個包就是java.util.zip; (注意:這個包有個非常蛋疼的地方,中文路徑會出現亂碼)
那麼如何解決這個亂碼問題:只需要使用apache的ant.jar這個架包就行了,代碼不會變,如果你用原生JDK寫的,那麼只需更換導入包就好
目錄進入點是檔案在壓縮檔案中的映射,代表壓縮檔案。壓縮檔案時,建立目錄進入點,將檔案寫入該目錄進入點。解壓縮時,取得目錄進入點,將該目錄進入點的內容寫入硬碟指定檔。
如果目錄進入點是資料夾,在命名時必須以路徑分隔符號結尾,在Window作業系統中名稱分隔符號為「/」。
無論是呼叫createNewFile()建立文件,或是在建立輸出流時由輸出流負責創建文件,都必須保證父路徑已經存在,否則文件無法建立。
#mkdirs():建立多層目錄。
mkdir():建立一級目錄,如果父路徑不存在,建立失敗。
首先為檔案或資料夾建立目錄進入點,目錄進入點的名稱為目前檔案相對於壓縮檔案的路徑,資料夾的目錄進入點名稱必須以名稱分隔符號結尾,以區別於檔案。
ZipEntry entry = new ZipEntry(压缩文件夹名称 + File.separator+文件或文件夹路径);
使用ZipOutputStream輸出流將檔案寫入對應目錄進入點中,寫入完成,關閉目錄進入點。
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); } } } }
以上是java中的壓縮與解壓縮實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!