Java 解压缩zip和tar.gz

编程入门 行业动态 更新时间:2024-10-13 04:22:40

Java <a href=https://www.elefans.com/category/jswz/34/1770316.html style=解压缩zip和tar.gz"/>

Java 解压缩zip和tar.gz

记录压缩有空目录报错的问题,

使用的是Apache的common-compress1.9

 

ZIP格式的解压缩

package com.lemo.rms.util;import org.apachemonspress.archivers.zip.Zip64Mode;
import org.apachemonspress.archivers.zip.ZipArchiveEntry;
import org.apachemonspress.archivers.zip.ZipArchiveInputStream;
import org.apachemonspress.archivers.zip.ZipArchiveOutputStream;
import org.apachemons.io.IOUtils;
import org.apachemons.lang3.StringUtils;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;/*** zip解压缩** @author 杨小华* @version 1.0.0* @date 2018/1/22 17:40*/
public class ZipUtil {private static final int BUFFER_SIZE = 1024;/*** 区分目录*/private static final String PATH = "/";/*** zip压缩文件*/public static void zip(String dir, String zipPath) {List<String> paths = getFiles(dir);compressFilesZip(paths.toArray(new String[paths.size()]), zipPath, dir);}/*** 递归取到当前目录所有文件*/private static List<String> getFiles(String dir) {List<String> listFiles = new ArrayList<>();File file = new File(dir);File[] files = file.listFiles();String str = null;for (File f : files) {str = f.getAbsolutePath();listFiles.add(str);if (f.isDirectory()) {listFiles.addAll(getFiles(str));}}return listFiles;}/*** 文件名处理*/private static String getFilePathName(String dir, String path) {String p = path.replace(dir + File.separator, "");p = p.replace("\\", "/");return p;}/*** 把文件压缩成zip格式** @param files       需要压缩的文件* @param zipFilePath 压缩后的zip文件路径   ,如"D:/test/aa.zip";*/private static void compressFilesZip(String[] files, String zipFilePath, String dir) {if (files == null || files.length <= 0) {return;}File zipFile = new File(zipFilePath);try (ZipArchiveOutputStream zaos = new ZipArchiveOutputStream(zipFile)) {zaos.setUseZip64(Zip64Mode.AsNeeded);//将每个文件用ZipArchiveEntry封装//再用ZipArchiveOutputStream写到压缩文件中for (String strFile : files) {File file = new File(strFile);if (file != null) {String name = getFilePathName(dir, strFile);ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, name);zaos.putArchiveEntry(zipArchiveEntry);if (file.isDirectory()) {continue;}try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {byte[] buffer = new byte[1024];int len = -1;while ((len = is.read(buffer)) != -1) {//把缓冲区的字节写入到ZipArchiveEntryzaos.write(buffer, 0, len);}zaos.closeArchiveEntry();} catch (Exception e) {throw new RuntimeException(e);}}}zaos.finish();} catch (Exception e) {throw new RuntimeException(e);}}/*** 解压 zip 文件** @param zipFile zip 压缩文件* @param destDir zip 压缩文件解压后保存的目录* @return 返回 zip 压缩文件里的文件名的 list*/public static List<String> unZip(File zipFile, String destDir) {// 如果 destDir 为 null, 空字符串, 或者全是空格, 则解压到压缩文件所在目录if (StringUtils.isBlank(destDir)) {destDir = zipFile.getParent();}destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;List<String> fileNames = new ArrayList<>();try (ZipArchiveInputStream is = new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE));) {ZipArchiveEntry entry = null;while ((entry = is.getNextZipEntry()) != null) {fileNames.add(entry.getName());if (entry.isDirectory()) {File directory = new File(destDir, entry.getName());directory.mkdirs();} else {try (OutputStream os = new BufferedOutputStream(new FileOutputStream(new File(destDir,entry.getName())), BUFFER_SIZE);) {IOUtils.copy(is, os);}}}} catch (Exception e) {throw new RuntimeException(e);}return fileNames;}/*** 解压 zip 文件** @param zipFilePath zip 压缩文件的路径* @param destDir     zip 压缩文件解压后保存的目录* @return 返回 zip 压缩文件里的文件名的 list*/public static List<String> unZip(String zipFilePath, String destDir) throws Exception {File zipFile = new File(zipFilePath);return unZip(zipFile, destDir);}public static void main(String[] args) {
//        System.out.println(names);zip("D:\\nihao", "C:\\Users\\leimo\\Desktop\\nihao\\test.zip");
//        unZip("C:\\Users\\leimo\\Desktop\\nihao\\test.zip",}
}

GZIP格式解压缩

package com.lemo.rms.util;import org.apachemonspress.archivers.tar.TarArchiveEntry;
import org.apachemonspress.archivers.tar.TarArchiveInputStream;
import org.apachemonspress.archivers.tar.TarArchiveOutputStream;
import org.apachemonspresspressors.gzip.GzipCompressorInputStream;
import org.apachemonspresspressors.gzip.GzipCompressorOutputStream;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** 解压缩成tar.gz** @author 杨小华* @version 1.0.0* @date 2018/1/22 14:45*/
public class GZIPUtil {/*** tar后缀*/private static final String TAR_SUFFIX = ".tar";/*** gz后缀*/private static final String GZ_SUFFIX = ".gz";/*** 区分目录*/private static final String PATH = "/";/*** 字节数组*/private static final int BYTE_SIZE = 1024;/*** 归档** @param srcFile 源文件* @return java.lang.String* @author 杨小华* @date 2018/1/22 15:38* @since 1.0.0*/public static String archive(String srcFile) throws IOException {File file = new File(srcFile);TarArchiveOutputStream tos = new TarArchiveOutputStream(new FileOutputStream(file.getAbsolutePath() + TAR_SUFFIX));String basePath = file.getName();if (file.isDirectory()) {archiveDir(file, tos, basePath);} else {archiveHandle(tos, file, basePath);}tos.close();return file.getAbsolutePath() + TAR_SUFFIX;}/*** 目录归档** @param dir      目录* @param taos     流* @param basePath 归档包内相对路径* @return void* @author 杨小华* @date 2018/1/22 15:40* @since 1.0.0*/private static void archiveDir(File dir, TarArchiveOutputStream taos, String basePath) throwsIOException {File[] files = dir.listFiles();for (File fi : files) {if (fi.isDirectory()) {archiveDir(fi, taos, basePath + File.separator + fi.getName());} else {archiveHandle(taos, fi, basePath);}}}/*** 具体归档处理(文件)** @param taos     输出流* @param file     文件* @param basePath 文件路径* @return void* @author 杨小华* @date 2018/1/22 20:16* @since 1.0.0*/private static void archiveHandle(TarArchiveOutputStream taos, File file, String basePath)throws IOException {TarArchiveEntry tEntry = new TarArchiveEntry(basePath + File.separator + file.getName());tEntry.setSize(file.length());taos.putArchiveEntry(tEntry);try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {byte[] buffer = new byte[BYTE_SIZE];int read = -1;while ((read = bis.read(buffer)) != -1) {taos.write(buffer, 0, read);}}//这里必须写,否则会失败taos.closeArchiveEntry();}/*** 把tar包压缩成gz** @param path tar文件路径* @return java.lang.String* @author 杨小华* @date 2018/1/22 20:17* @since 1.0.0*/public static String compressArchive(String path) throws IOException {try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path))) {try (GzipCompressorOutputStream gcos = new GzipCompressorOutputStream(newBufferedOutputStream(new FileOutputStream(path + GZ_SUFFIX)))) {byte[] buffer = new byte[BYTE_SIZE];int read = -1;while ((read = bis.read(buffer)) != -1) {gcos.write(buffer, 0, read);}}}return path + GZ_SUFFIX;}/*** 解压gz** @return void* @author 杨小华* @date 2018/1/22 20:18* @since 1.0.0*/public static void unCompressArchiveGz(String archive) throws IOException {File file = new File(archive);String finalName = null;try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {String fileName = file.getName().substring(0, file.getName().lastIndexOf("."));finalName = file.getParent() + File.separator + fileName;try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(finalName))) {GzipCompressorInputStream gcis = new GzipCompressorInputStream(bis);byte[] buffer = new byte[BYTE_SIZE];int read = -1;while ((read = gcis.read(buffer)) != -1) {bos.write(buffer, 0, read);}}}unCompressTar(finalName);}/*** 解压tar** @param finalName 文件路径* @return void* @author 杨小华* @date 2018/1/22 20:18* @since 1.0.0*/private static void unCompressTar(String finalName) throws IOException {File file = new File(finalName);String parentPath = file.getParent();try (TarArchiveInputStream tais =new TarArchiveInputStream(new FileInputStream(file))) {TarArchiveEntry tarArchiveEntry = null;while ((tarArchiveEntry = tais.getNextTarEntry()) != null) {String name = tarArchiveEntry.getName();File tarFile = new File(parentPath, name);if (!tarFile.getParentFile().exists()) {tarFile.getParentFile().mkdirs();}try (BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream(tarFile))) {int read = -1;byte[] buffer = new byte[BYTE_SIZE];while ((read = tais.read(buffer)) != -1) {bos.write(buffer, 0, read);}}}}//删除tar文件file.delete();}}

 

更多推荐

Java 解压缩zip和tar.gz

本文发布于:2024-03-05 23:50:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1713784.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:解压缩   Java   zip   gz   tar

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!