Java8 Zip 压缩与解压缩
生活随笔
收集整理的這篇文章主要介紹了
Java8 Zip 压缩与解压缩
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
網(wǎng)上找過幾個例子都有點小問題,還是谷歌找出來的靠譜。主要是增加了指定文件的功能,通過 Java8 的 Lambda 判斷是否加入 ZIP 壓縮,比較方便。函數(shù)表達式的簽名是 Function<File, Boolean>,參數(shù)是待加入的 File 對象,返回值 true 表示允許,反之不行。
完整代碼在:https://gitee.com/sp42_admin/ajaxjs/blob/master/ajaxjs-base/src/main/java/com/ajaxjs/util/io/FileHelper.java
/*** Copyright sp42 frank@ajaxjs.com** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.ajaxjs.util.io;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.function.Function; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream;import com.ajaxjs.util.logger.LogHelper;/*** ZIP 壓縮/解壓縮* * @author sp42**/ public class ZipHelper {private static final LogHelper LOGGER = LogHelper.getLog(ZipHelper.class);/*** 解壓文件* * @param save 解壓文件的路徑,必須為目錄* @param zipFile 輸入的解壓文件路徑,例如C:/temp/foo.zip或 c:\\temp\\bar.zip*/public static void unzip(String save, String zipFile) {if (!new File(save).isDirectory())throw new IllegalArgumentException("保存的路徑必須為目錄路徑");long start = System.currentTimeMillis();File folder = new File(save);if (!folder.exists())folder.mkdirs();try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));) {ZipEntry ze;while ((ze = zis.getNextEntry()) != null) {File newFile = new File(save + File.separator + ze.getName());System.out.println("file unzip : " + newFile.getAbsoluteFile());// 大部分網(wǎng)絡(luò)上的源碼,這里沒有判斷子目錄if (ze.isDirectory()) {newFile.mkdirs();} else { // new File(newFile.getParent()).mkdirs();FileHelper.initFolder(newFile);FileOutputStream fos = new FileOutputStream(newFile);IoHelper.write(zis, fos, false);fos.close();}// ze = zis.getNextEntry();}zis.closeEntry();} catch (IOException e) {LOGGER.warning(e);}LOGGER.info("解壓縮完成,耗時:{0}ms,保存在{1}", System.currentTimeMillis() - start, save);}/*** 壓縮文件* * @param toZip 要壓縮的目錄或文件* @param saveZip 壓縮后保存的 zip 文件名*/public static void zip(String toZip, String saveZip) {zip(toZip, saveZip, null);}/*** 壓縮文件* * @param toZip 要壓縮的目錄或文件* @param saveZip 壓縮后保存的 zip 文件名* @param everyFile 輸入 File,可在這 Lambda 里面判斷是否加入 ZIP 壓縮,返回 true 表示允許,反之不行*/public static void zip(String toZip, String saveZip, Function<File, Boolean> everyFile) {long start = System.currentTimeMillis();File fileToZip = new File(toZip);FileHelper.initFolder(saveZip);try (FileOutputStream fos = new FileOutputStream(saveZip); ZipOutputStream zipOut = new ZipOutputStream(fos);) {zip(fileToZip, fileToZip.getName(), zipOut, everyFile);} catch (IOException e) {LOGGER.warning(e);}LOGGER.info("壓縮完成,耗時:{0}ms,保存在{1}", System.currentTimeMillis() - start, saveZip);}/*** 內(nèi)部的壓縮方法* * @param toZip 要壓縮的目錄或文件* @param fileName ZIP 內(nèi)的文件名* @param zipOut ZIP 流* @param everyFile 輸入 File,可在這 Lambda 里面判斷是否加入 ZIP 壓縮,返回 true 表示允許,反之不行*/private static void zip(File toZip, String fileName, ZipOutputStream zipOut, Function<File, Boolean> everyFile) {if (toZip.isHidden())return;if (everyFile != null && !everyFile.apply(toZip)) {return; // 跳過不要的}try {if (toZip.isDirectory()) {zipOut.putNextEntry(new ZipEntry(fileName.endsWith("/") ? fileName : fileName + "/"));zipOut.closeEntry();File[] children = toZip.listFiles();for (File childFile : children) {zip(childFile, fileName + "/" + childFile.getName(), zipOut, everyFile);}return;}zipOut.putNextEntry(new ZipEntry(fileName));try (FileInputStream in = new FileInputStream(toZip);) {IoHelper.write(in, zipOut, false);}} catch (IOException e) {LOGGER.warning(e);}} }總結(jié)
以上是生活随笔為你收集整理的Java8 Zip 压缩与解压缩的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中怎样写渐变色代码,纯css简单
- 下一篇: 成大事,你一定需要经历的二次跃升