成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java 如何實現解壓縮文件和文件夾

瀏覽:155日期:2022-08-15 14:40:28
一 前言

項目開發中,總會遇到解壓縮文件的時候。比如,用戶下載多個文件時,服務端可以將多個文件壓縮成一個文件(例如xx.zip或xx.rar)。用戶上傳資料時,允許上傳壓縮文件,服務端進行解壓讀取每一個文件。

基于通用性,以下介紹幾種解壓縮文件的方式,包裝成工具類,供平時開發使用。

二 壓縮文件

壓縮文件,顧名思義,即把一個或多個文件壓縮成一個文件。壓縮也有2種形式,一種是將所有文件壓縮到同一目錄下,此種方式要注意文件重名覆蓋的問題。另一種是按原有文件樹結構進行壓縮,即壓縮后的文件樹結構保持不變。

壓縮文件操作,會使用到一個類,即ZipOutputStream。

2.1 壓縮多個文件

此方法將所有文件壓縮到同一個目錄下。方法傳入多個文件列表,和一個最終壓縮到的文件路徑名。

/** * 壓縮多個文件,壓縮后的所有文件在同一目錄下 * * @param zipFileName 壓縮后的文件名 * @param files 需要壓縮的文件列表 * @throws IOException IO異常 */ public static void zipMultipleFiles(String zipFileName, File... files) throws IOException { ZipOutputStream zipOutputStream = null; try { // 輸出流 zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileName)); // 遍歷每一個文件,進行輸出 for (File file : files) {zipOutputStream.putNextEntry(new ZipEntry(file.getName()));FileInputStream fileInputStream = new FileInputStream(file);int readLen;byte[] buffer = new byte[1024];while ((readLen = fileInputStream.read(buffer)) != -1) { zipOutputStream.write(buffer, 0, readLen);}// 關閉流fileInputStream.close();zipOutputStream.closeEntry(); } } finally { if (null != zipOutputStream) {try { zipOutputStream.close();} catch (IOException ex) { ex.printStackTrace();} } } }

測試,將D盤下的infp.txt和infp1.txt文件壓縮到D盤下,壓縮文件名為my.zip。

public static void main(String[] args) throws Exception { zipMultipleFiles('D:/my.zip', new File('D:/infp.txt'), new File('D:/infp1.txt')); }2.2 壓縮文件或文件樹

此方法將文件夾下的所有文件按原有的樹形結構壓縮到文件中,也支持壓縮單個文件。原理也簡單,無非就是遞歸遍歷文件樹中的每一個文件,進行壓縮。有個注意的點每一個文件的寫入路徑是基于壓縮文件位置的相對路徑。

package com.nobody.zip;import java.io.*;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;public class ZipUtils { /** * 壓縮文件或文件夾(包括所有子目錄文件) * * @param sourceFile 源文件 * @param format 格式(zip或rar) * @throws IOException 異常信息 */ public static void zipFileTree(File sourceFile, String format) throws IOException { ZipOutputStream zipOutputStream = null; try { String zipFileName; if (sourceFile.isDirectory()) { // 目錄zipFileName = sourceFile.getParent() + File.separator + sourceFile.getName() + '.' + format; } else { // 單個文件zipFileName = sourceFile.getParent() + sourceFile.getName().substring(0, sourceFile.getName().lastIndexOf('.')) + '.' + format; } // 壓縮輸出流 zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileName)); zip(sourceFile, zipOutputStream, ''); } finally { if (null != zipOutputStream) {// 關閉流try { zipOutputStream.close();} catch (IOException ex) { ex.printStackTrace();} } } } /** * 遞歸壓縮文件 * * @param file 當前文件 * @param zipOutputStream 壓縮輸出流 * @param relativePath 相對路徑 * @throws IOException IO異常 */ private static void zip(File file, ZipOutputStream zipOutputStream, String relativePath) throws IOException { FileInputStream fileInputStream = null; try { if (file.isDirectory()) { // 當前為文件夾// 當前文件夾下的所有文件File[] list = file.listFiles();if (null != list) { // 計算當前的相對路徑 relativePath += (relativePath.length() == 0 ? '' : '/') + file.getName(); // 遞歸壓縮每個文件 for (File f : list) { zip(f, zipOutputStream, relativePath); }} } else { // 壓縮文件// 計算文件的相對路徑relativePath += (relativePath.length() == 0 ? '' : '/') + file.getName();// 寫入單個文件zipOutputStream.putNextEntry(new ZipEntry(relativePath));fileInputStream = new FileInputStream(file);int readLen;byte[] buffer = new byte[1024];while ((readLen = fileInputStream.read(buffer)) != -1) { zipOutputStream.write(buffer, 0, readLen);}zipOutputStream.closeEntry(); } } finally { // 關閉流 if (fileInputStream != null) {try { fileInputStream.close();} catch (IOException ex) { ex.printStackTrace();} } } } public static void main(String[] args) throws Exception { String path = 'D:/test'; String format = 'zip'; zipFileTree(new File(path), format); }}

上例將test目錄下的所有文件壓縮到同一目錄下的test.zip文件中。

2.3 借助文件訪問器壓縮

還有一種更簡單的方式,我們不自己寫遞歸遍歷。借助Java原生類,SimpleFileVisitor,它提供了幾個訪問文件的方法,其中有個方法visitFile,對于文件樹中的每一個文件(文件夾除外),都會調用這個方法。我們只要寫一個類繼承SimpleFileVisitor,然后重寫visitFile方法,實現將每一個文件寫入到壓縮文件中即可。

當然,除了visitFile方法,它里面還有preVisitDirectory,postVisitDirectory,visitFileFailed等方法,通過方法名大家也猜出什么意思了。

package com.nobody.zip;import java.io.FileOutputStream;import java.io.IOException;import java.nio.file.*;import java.nio.file.attribute.BasicFileAttributes;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;/** * @Description * @Author Mr.nobody * @Date 2021/3/8 * @Version 1.0.0 */public class ZipFileTree extends SimpleFileVisitor<Path> { // zip輸出流 private ZipOutputStream zipOutputStream; // 源目錄 private Path sourcePath; public ZipFileTree() {} /** * 壓縮目錄以及所有子目錄文件 * * @param sourceDir 源目錄 */ public void zipFile(String sourceDir) throws IOException { try { // 壓縮后的文件和源目錄在同一目錄下 String zipFileName = sourceDir + '.zip'; this.zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileName)); this.sourcePath = Paths.get(sourceDir); // 開始遍歷文件樹 Files.walkFileTree(sourcePath, this); } finally { // 關閉流 if (null != zipOutputStream) {zipOutputStream.close(); } } } // 遍歷到的每一個文件都會執行此方法 @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException { // 取相對路徑 Path targetFile = sourcePath.relativize(file); // 寫入單個文件 zipOutputStream.putNextEntry(new ZipEntry(targetFile.toString())); byte[] bytes = Files.readAllBytes(file); zipOutputStream.write(bytes, 0, bytes.length); zipOutputStream.closeEntry(); // 繼續遍歷 return FileVisitResult.CONTINUE; } // 遍歷每一個目錄時都會調用的方法 @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { return super.preVisitDirectory(dir, attrs); } // 遍歷完一個目錄下的所有文件后,再調用這個目錄的方法 @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { return super.postVisitDirectory(dir, exc); } // 遍歷文件失敗后調用的方法 @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { return super.visitFileFailed(file, exc); } public static void main(String[] args) throws IOException { // 需要壓縮源目錄 String sourceDir = 'D:/test'; // 壓縮 new ZipFileTree().zipFile(sourceDir); }}三 解壓文件

解壓壓縮包,借助ZipInputStream類,可以讀取到壓縮包中的每一個文件,然后根據讀取到的文件屬性,寫入到相應路徑下即可。對于解壓壓縮包中是文件樹的結構,每讀取到一個文件后,如果是多層路徑下的文件,需要先創建父目錄,再寫入文件流。

package com.nobody.zip;import java.io.*;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;/** * @Description 解壓縮文件工具類 * @Author Mr.nobody * @Date 2021/3/8 * @Version 1.0.0 */public class ZipUtils { /** * 解壓 * * @param zipFilePath 帶解壓文件 * @param desDirectory 解壓到的目錄 * @throws Exception */ public static void unzip(String zipFilePath, String desDirectory) throws Exception { File desDir = new File(desDirectory); if (!desDir.exists()) { boolean mkdirSuccess = desDir.mkdir(); if (!mkdirSuccess) {throw new Exception('創建解壓目標文件夾失敗'); } } // 讀入流 ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFilePath)); // 遍歷每一個文件 ZipEntry zipEntry = zipInputStream.getNextEntry(); while (zipEntry != null) { if (zipEntry.isDirectory()) { // 文件夾String unzipFilePath = desDirectory + File.separator + zipEntry.getName();// 直接創建mkdir(new File(unzipFilePath)); } else { // 文件String unzipFilePath = desDirectory + File.separator + zipEntry.getName();File file = new File(unzipFilePath);// 創建父目錄mkdir(file.getParentFile());// 寫出文件流BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(unzipFilePath));byte[] bytes = new byte[1024];int readLen;while ((readLen = zipInputStream.read(bytes)) != -1) { bufferedOutputStream.write(bytes, 0, readLen);}bufferedOutputStream.close(); } zipInputStream.closeEntry(); zipEntry = zipInputStream.getNextEntry(); } zipInputStream.close(); } // 如果父目錄不存在則創建 private static void mkdir(File file) { if (null == file || file.exists()) { return; } mkdir(file.getParentFile()); file.mkdir(); } public static void main(String[] args) throws Exception { String zipFilePath = 'D:/test.zip'; String desDirectory = 'D:/a'; unzip(zipFilePath, desDirectory); }}四 總結

在解壓縮文件過程中,主要是對流的讀取操作,注意進行異常處理,以及關閉流。web應用中,通過接口可以實現文件上傳下載,對應的我們只要把壓縮后的文件,寫入到response.getOutputStream()輸出流即可。解壓縮文件時,注意空文件夾的處理。

此演示項目已上傳到Github,如有需要可自行下載,歡迎 Star 。 https://github.com/LucioChn/common-utils

以上就是Java 如何實現解壓縮文件和文件夾的詳細內容,更多關于Java 解壓縮文件和文件夾的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国精产品一区一区三区mba桃花| 亚洲一级在线| 一本久道综合久久精品| 国产欧美一二三区| 成人激情午夜影院| 欧美日韩大陆一区二区| 日本亚洲视频在线| 亚洲一卡久久| 一区二区三区加勒比av| 在线看无码的免费网站| 亚洲欧洲精品一区二区三区不卡| 91香蕉国产在线观看软件| 日韩精品一区二区三区视频 | 777午夜精品视频在线播放| 日韩电影在线免费观看| 国产乱人伦精品一区二区 | 亚洲综合精品自拍| 91同城在线观看| xfplay精品久久| 成人黄色电影在线| 欧美成人性福生活免费看| 国产精品99久| 欧美r级在线观看| 91视频观看免费| 国产精品天干天干在线综合| 黄色成人av网站| 亚洲欧美色一区| 国产色综合网| 三级一区在线视频先锋| 日本韩国一区二区| 久久99精品久久只有精品| 欧美电影在线免费观看| 国产精品自拍三区| 日韩你懂的在线观看| yourporn久久国产精品| 久久蜜桃av一区精品变态类天堂 | 欧美日韩在线免费视频| 国产毛片精品一区| 精品少妇一区二区三区视频免付费| eeuss鲁片一区二区三区在线观看| 久久午夜色播影院免费高清| 欧美91福利在线观看| 最新高清无码专区| 亚洲欧美日产图| 狠狠网亚洲精品| 欧美一区二区三区在线看| 高清成人免费视频| 久久久久国产成人精品亚洲午夜| 91丨porny丨最新| 国产精品久久久久婷婷二区次| 亚洲三级影院| 日日夜夜一区二区| 91精品欧美综合在线观看最新| 成人综合在线观看| 日本一区二区三区久久久久久久久不| 极品日韩av| 亚洲国产综合视频在线观看| 欧美图区在线视频| 成人午夜碰碰视频| 国产精品久久久久久福利一牛影视| 国产日韩欧美一区在线 | 国产精品高潮久久久久无| 亚洲一区观看| 精品亚洲免费视频| 久久久亚洲精品一区二区三区| 一区在线视频| 日韩国产欧美在线播放| 制服丝袜中文字幕一区| 欧美a级片网站| 亚洲国产另类精品专区| 欧美精品在欧美一区二区少妇| 国产成人综合亚洲网站| 欧美高清在线视频| 久久国产欧美精品| 国产a精品视频| 中文字幕精品一区二区精品绿巨人| 亚洲精品中文字幕在线| 美女视频黄免费的久久 | 亚洲成人免费av| 91精品国产一区二区三区| 欧美精品一区三区在线观看| 亚洲国产一区二区a毛片| 欧美顶级少妇做爰| 欧美另类亚洲| 日韩高清一区在线| 久久婷婷一区二区三区| 欧美综合77777色婷婷| 成人黄页毛片网站| 亚洲国产精品一区二区www在线| 日韩三级在线观看| 亚洲第一精品影视| 国产专区综合网| 18欧美乱大交hd1984| 欧美少妇一区二区| 欧美日韩三区| 另类中文字幕网| 成人免费在线播放视频| 欧美日韩国产123区| 狠狠入ady亚洲精品| 久久精品国产99国产| 国产精品高潮呻吟| 欧美一区二区三区系列电影| 国产欧美日韩一区| www.亚洲激情.com| 亚洲国产毛片aaaaa无费看| 精品国产一区二区三区不卡| 免费亚洲一区二区| 91最新地址在线播放| 婷婷一区二区三区| 久久久久综合网| 在线视频中文字幕一区二区| 欧美在线不卡| 久久精品国产秦先生| 中文字幕精品在线不卡| 欧美日韩精品电影| 日韩午夜av| 99精品欧美一区二区三区综合在线| 丝袜诱惑亚洲看片| 国产精品久久看| 日韩午夜激情电影| 男人天堂欧美日韩| 国产一区二区三区自拍| 国产麻豆视频一区| 午夜精品福利久久久| 欧美极品xxx| 日韩一级成人av| 久久久综合香蕉尹人综合网| 欧美日韩午夜| 国产999精品久久| 五月婷婷久久综合| 中文字幕一区视频| 26uuu国产在线精品一区二区| 在线视频国内一区二区| 99亚洲视频| 午夜精品免费| 福利一区二区在线| 麻豆传媒一区二区三区| 亚洲一卡二卡三卡四卡| 国产精品青草久久| 久久亚洲综合色一区二区三区| 欧美色综合影院| 亚洲综合三区| 国产精品国产三级欧美二区| 成人福利视频在线看| 久久99蜜桃精品| 亚洲一区成人在线| 亚洲欧美精品午睡沙发| 国产亚洲欧美在线| 欧美大胆一级视频| 欧美日韩在线观看一区二区 | 色噜噜狠狠色综合中国| 国产精品入口| 亚洲开发第一视频在线播放| 色综合视频一区二区三区高清| 国产成a人无v码亚洲福利| 久久成人免费电影| 五月婷婷综合网| 亚洲精品免费在线| 国产精品的网站| 国产精品久久网站| 国产精品久久精品日日| 国产精品色哟哟网站| 国产亚洲综合性久久久影院| 日韩欧美一区二区在线视频| 欧美理论片在线| 欧美片在线播放| 欧美精品免费视频| 欧美日韩国产123区| 在线观看成人小视频| 一本一道综合狠狠老| 久久综合一区二区三区| 久久精品官网| 久久久久久黄| 奶水喷射视频一区| 久久久久久穴| 色综合久久久久久久久久久| 色国产精品一区在线观看| 久久综合伊人| 日本电影亚洲天堂一区| 日本精品视频一区二区| 玖玖在线精品| 在线日韩av片| 欧美日韩一区二区三区高清| 欧美视频一区二区三区在线观看| 欧美在线观看你懂的| 91久久香蕉国产日韩欧美9色| 在线视频欧美区| 欧美人妖巨大在线| 91精品国产一区二区三区| 欧美xxxx老人做受| 久久蜜桃一区二区| 国产精品久久三| 亚洲综合激情小说| 日韩精品一区第一页| 久久黄色级2电影| 国产很黄免费观看久久| 成人h动漫精品| 午夜精品久久| 黄色工厂这里只有精品| 夜久久久久久|