日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:215日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀av国产精品久久久久 | 四虎4545www国产精品| 激情久久99| 日本蜜桃在线观看视频| 红桃视频欧美| 国产精品久一| 亚洲日本三级| 美女网站视频一区| 日韩欧美高清一区二区三区| 日韩成人高清| 日韩高清成人在线| 蜜桃av一区| 宅男在线一区| 日本激情一区| 激情91久久| 97精品资源在线观看| 亚洲精品a级片| 久久久久久久久久久9不雅视频| 88久久精品| 久久三级福利| 日本免费一区二区三区四区| 91精品麻豆| 日韩有吗在线观看| 久久国产高清| 国产精品成人a在线观看| 亚洲精品精选| 日韩在线一二三区| 国产成人精品亚洲日本在线观看| 亚洲精品麻豆| 亚洲精品欧美| 久久国内精品自在自线400部| 久久国产精品99国产| 欧美黄色精品| 丁香婷婷久久| 国产精品三级| 高清一区二区三区av| 国产乱人伦丫前精品视频| 国产区精品区| 精品免费视频| 精品一区视频| 久久精品网址| 久久精品亚洲人成影院| 欧美日韩日本国产亚洲在线| 国产一区成人| 热久久国产精品| 亚洲欧洲一区| 亚洲网址在线观看| 欧美日韩1区2区3区| 精品视频一二| 麻豆91精品| 国产一区二区三区久久| 99免费精品| 日韩成人在线看| 日韩伦理一区| 日韩黄色在线观看| 97se综合| 日本欧美韩国一区三区| 日本久久成人网| 欧美另类中文字幕| 亚洲a在线视频| 日韩极品在线观看| 成人久久久久| 国产伦理一区| 中文字幕日韩亚洲| 九九综合九九| 91看片一区| 国产精久久一区二区| 亚洲美洲欧洲综合国产一区| 国产精品美女在线观看直播| 性欧美xxxx免费岛国不卡电影| 日韩视频一区| 欧美在线首页| 国产网站在线| 国产精品一线| 噜噜噜躁狠狠躁狠狠精品视频 | 国产精品欧美三级在线观看| 欧美日韩视频免费观看| 日韩三级久久| 亚洲久久一区| 欧美日韩免费观看一区=区三区 | 欧美 日韩 国产一区二区在线视频| 亚洲欧美日韩国产一区| 精品美女久久| 国产精品视频一区二区三区综合| 亚洲午夜91| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲综合不卡| 精品免费av在线| 国产日韩一区| 日韩午夜在线| 日韩中文影院| 国产精品一区二区三区美女| 蜜桃av一区| 六月天综合网| 喷白浆一区二区| 亚洲va久久| 亚洲精品女人| 精品资源在线| 女人av一区| 亚洲精品女人| 免费在线亚洲欧美| 日韩不卡免费高清视频| 99pao成人国产永久免费视频| 国产亚洲一区在线| 日韩精品一级| 欧美日韩免费观看视频| 国产一级久久| 精品久久中文| 日韩影院精彩在线| 丰满少妇一区| 激情综合婷婷| 日本中文字幕视频一区| se01亚洲视频 | 久久精品xxxxx| 精品午夜久久| 爽爽淫人综合网网站| 国产一区二区久久久久| 性欧美videohd高精| 亚洲啊v在线免费视频| 国产精品99久久精品| 视频一区在线播放| 欧美丝袜一区| 在线天堂中文资源最新版| 快she精品国产999| av高清不卡| 免费亚洲一区| 国产精品久久久久久久久久齐齐 | 亚洲免费专区| 亚洲午夜黄色| 亚洲一级影院| 亚洲午夜久久久久久尤物| 老司机免费视频一区二区| 亚洲欧洲国产精品一区| 99视频在线精品国自产拍免费观看| 国产一区二区三区四区二区| 亚洲精品成a人ⅴ香蕉片| 免费av一区| 88xx成人免费观看视频库| 久久99影视| 精品一区二区三区中文字幕在线| 久久精品72免费观看| 亚欧成人精品| 久久在线电影| 亚洲一区二区三区高清不卡| 99热精品久久| 欧美日韩日本国产亚洲在线| 亚洲二区三区不卡| 99国产成+人+综合+亚洲欧美| 久久精品一区二区不卡| 久久精品高清| 亚洲欧美日韩专区| 日本久久一区| 久久精品国产精品亚洲毛片| 久久精品国产久精国产爱| 91av亚洲| 亚洲一区黄色| 日韩国产一区二| 91综合久久爱com| 国产不卡av一区二区| 国产在线日韩| 免费高清在线一区| 国产精品xxx| 99久久夜色精品国产亚洲1000部| 一本一道久久a久久精品蜜桃| 亚洲网址在线观看| 免费一区二区三区在线视频| 伊人精品一区| 国产精品最新| 91精品二区| 国产成人精品三级高清久久91| 亚洲少妇在线| 久久精品色播| 99精品小视频| 国产精品久久久久久久久久齐齐 | 欧美亚洲免费| 黄色日韩在线| 精品三级av| 欧美综合国产| 久久精品高清| 久久69成人| 日欧美一区二区| 亚洲国产专区| 日韩国产欧美| 久久精品国产亚洲一区二区三区| 91精品综合| 精品在线网站观看| 亚洲另类视频| 欧美在线综合| 国产毛片久久| 视频福利一区| 一本大道色婷婷在线| 亚洲国产欧美日本视频| 国产精品白丝久久av网站| 日韩av一级片| 午夜亚洲福利| 日韩国产在线观看| 亚洲精品少妇| 热久久久久久| 91精品尤物| 久久黄色影视|