Java 解压缩各种格式

您所在的位置:网站首页 1公斤水等于多少升水水是多少斤水 Java 解压缩各种格式

Java 解压缩各种格式

2024-01-15 00:10| 来源: 网络整理| 查看: 265

一. Gzip解压缩

工具类:

package com.mazaiting; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class GzipUtil { /**utf-8编码*/ public static final String GZIP_ENCODE_UTF_8 = "UTF-8"; /**iso-8859-1编码*/ public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1"; /** * "utf-8"编码压缩 * @param string 要压缩的字符串 * @return 字节数组 */ public static byte[] compress(String string) { return compress(string, GZIP_ENCODE_UTF_8); } /** * 指定编码压缩 * @param string 要压缩的字符串 * @param encoding 编码 * @return 字节数组 */ public static byte[] compress(String string, String encoding) { // 判断是否为空 if (null == string || string.length() == 0) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzipOutputStream; try { gzipOutputStream = new GZIPOutputStream(baos); gzipOutputStream.write(string.getBytes(encoding)); gzipOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } return baos.toByteArray(); } /** * 解压为字节数组 * @param bytes 要解压的字节数组 * @return 字节数组 */ public static byte[] uncompress(byte[] bytes) { if (null == bytes || bytes.length == 0) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); GZIPInputStream unGzip; try { unGzip = new GZIPInputStream(bais); byte[] buffer = new byte[256]; int n; while ((n = unGzip.read(buffer)) >= 0) { baos.write(buffer, 0, n); } } catch (Exception e) { e.printStackTrace(); } return baos.toByteArray(); } /** * "utf-8"编码解压 * @param bytes 要解压的字节数组 * @return 字节数组 */ public static String uncompressToString(byte[] bytes) { return uncompressToString(bytes, GZIP_ENCODE_UTF_8); } /** * 指定编码解压 * @param string 要压缩的字符串 * @param encoding 编码 * @return 字节数组 */ public static String uncompressToString(byte[] bytes, String encoding) { if (null == bytes || bytes.length == 0) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); GZIPInputStream unGzip; try { unGzip = new GZIPInputStream(bais); byte[] buffer = new byte[256]; int n; while ((n = unGzip.read(buffer)) >= 0) { baos.write(buffer, 0, n); } return baos.toString(encoding); } catch (Exception e) { e.printStackTrace(); } return null; } }

具体使用:

package com.mazaiting; public class Test { public static void main(String[] args) { String string = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; System.out.println("字符串长度: " + string.length()); System.out.println("压缩后: " + GzipUtil.compress(string).length); System.out.println("解压后: " + GzipUtil.uncompress(GzipUtil.compress(string)).length); System.out.println("解压后字符串长度: " + GzipUtil.uncompressToString(GzipUtil.compress(string)).length()); } } 二、Zip解压缩

文中所需工具类Java 文件遍历

工具类 /** * Zip格式数据操作类 * @author mazaiting */ public class ZipUtil { /**缓冲字节--1M*/ private static final int BUFF_SIZE = 1024 * 1024; /** * 批量压缩文件(文件夹) * @param resFileList 要压缩的文件(夹)列表 * @param zipFile 生成的压缩文件 * @throws IOException 当压缩过程出错时抛出 */ public static void zipFiles(Collection resFileList, File zipFile) throws IOException { ZipOutputStream zipOut = new ZipOutputStream( new BufferedOutputStream(new FileOutputStream(zipFile), BUFF_SIZE)); for (File resFile : resFileList) { zipFile(resFile, zipOut, ""); } zipOut.close(); } /** * 批量压缩文件(文件夹) * @param resFileList 要压缩的文件(夹)列表 * @param zipFile 生成的压缩文件 * @param comment 压缩文件的注释 * @throws IOException 当压缩过程出错时抛出 */ public static void zipFiles(Collection resFileList, File zipFile, String comment) throws IOException { ZipOutputStream zipOut = new ZipOutputStream( new BufferedOutputStream(new FileOutputStream(zipFile), BUFF_SIZE)); for (File resFile : resFileList) { zipFile(resFile, zipOut, ""); } zipOut.setComment(comment); zipOut.close(); } /** * 解压缩一个文件 * @param zipFile 压缩文件 * @param folderPath 解压缩的目标目录 * @throws IOException * @throws ZipException */ public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException { // 根据路径创建一个文件 File desDir = new File(folderPath); // 判断文件是否存在,如果不存在则创建 if (!desDir.exists()) { desDir.mkdirs(); } // 创建一个压缩文件 ZipFile zFile = new ZipFile(zipFile); // 循环遍历 for (Enumeration entries = zFile.entries(); entries.hasMoreElements(); ){ ZipEntry entry = (ZipEntry) entries.nextElement(); InputStream in = zFile.getInputStream(entry); String str = folderPath + File.separator + entry.getName(); str = new String(str.getBytes("8859_1"), "GB2312"); File desFile = new File(str); // 判断文件是否存在 if (!desFile.exists()) { File fileParentDir = desFile.getParentFile(); // 判断父文件夹是否存在 if (!fileParentDir.exists()) { fileParentDir.mkdirs(); } // 创建新文件 desFile.createNewFile(); } OutputStream out = new FileOutputStream(desFile); byte[] buffer = new byte[BUFF_SIZE]; int realLength; while ((realLength = in.read(buffer)) >0) { out.write(buffer, 0, realLength); } in.close(); out.close(); } } /** * 解压文件名包含传入文字的文件 * @param zipFile 压缩文件 * @param folderPath 目标文件夹 * @param nameContains 传入的文件匹配名 * @throws ZipException 压缩格式有误时抛出 * @throws IOException IO错误时抛出 */ public static ArrayList upZipSelectedFile(File zipFile, String folderPath, String nameContains) throws ZipException, IOException { ArrayList fileList = new ArrayList(); File desDir = new File(folderPath); if (!desDir.exists()) { desDir.mkdir(); } ZipFile zf = new ZipFile(zipFile); for (Enumeration entries = zf.entries(); entries.hasMoreElements();) { ZipEntry entry = ((ZipEntry)entries.nextElement()); if (entry.getName().contains(nameContains)) { InputStream in = zf.getInputStream(entry); String str = folderPath + File.separator + entry.getName(); str = new String(str.getBytes("8859_1"), "GB2312"); // str.getBytes("GB2312"),"8859_1" 输出 // str.getBytes("8859_1"),"GB2312" 输入 File desFile = new File(str); if (!desFile.exists()) { File fileParentDir = desFile.getParentFile(); if (!fileParentDir.exists()) { fileParentDir.mkdirs(); } desFile.createNewFile(); } OutputStream out = new FileOutputStream(desFile); byte buffer[] = new byte[BUFF_SIZE]; int realLength; while ((realLength = in.read(buffer)) > 0) { out.write(buffer, 0, realLength); } in.close(); out.close(); fileList.add(desFile); } } return fileList; } /** * 压缩文件 * @param resFile 需要压缩的文件(夹) * @param zipOut 压缩的目的文件 * @param rootPath 压缩的文件路径 * @throws IOException */ private static void zipFile(File resFile, ZipOutputStream zipOut, String rootPath) throws IOException { // 判断文件路径长度是否大于0, 大于0时string为"/", 等于0时为"" String string = rootPath.trim().length() == 0 ? "" : File.separator; // 压缩文件生成的路径 rootPath = rootPath + string + resFile.getName(); // 路径转码 rootPath = new String(rootPath.getBytes("8859_1"), "GB2312"); // 判断压缩的是否是路径 if (resFile.isDirectory()) { // 获取当前路径下的所有文件 File[] listFiles = resFile.listFiles(); for (File file : listFiles) { zipFile(file, zipOut, rootPath); } } else { byte[] buffer = new byte[BUFF_SIZE]; BufferedInputStream in = new BufferedInputStream( new FileInputStream(resFile), BUFF_SIZE); zipOut.putNextEntry(new ZipEntry(rootPath)); int realLength; while ((realLength = in.read(buffer)) != -1) { zipOut.write(buffer, 0, realLength); } in.close(); zipOut.flush(); zipOut.closeEntry(); } } /** * 获得压缩文件内文件列表 * @param zipFile 压缩文件 * @return 压缩文件内文件名称 * @throws IOException * @throws ZipException */ public static ArrayList getEntriesNames(File zipFile) throws ZipException, IOException { ArrayList entryNames = new ArrayList(); Enumeration entries = getEntriesEnumeration(zipFile); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); entryNames.add(new String( getEntryName(entry).getBytes("GB2312"), "8859_1")); } return entryNames; } /** * 获得压缩文件对象的名称 * @param entry 压缩文件对象 * @return 压缩文件对象的名称 * @throws UnsupportedEncodingException */ private static String getEntryName(ZipEntry entry) throws UnsupportedEncodingException { return new String(entry.getName().getBytes("GB2312"), "8859_1"); } /** * 取得压缩文件对象的注释 * @param entry 压缩文件对象 * @return 压缩文件对象的注释 * @throws UnsupportedEncodingException */ public static String getEntryComment(ZipEntry entry) throws UnsupportedEncodingException { return new String(entry.getComment().getBytes("GB2312"), "8859_1"); } /** * 获得压缩文件内压缩文件对象以取得其属性 * @param zipFile 压缩文件 * @return 返回一个压缩文件列表 * @throws IOException * @throws ZipException */ private static Enumeration getEntriesEnumeration(File zipFile) throws ZipException, IOException { ZipFile zf = new ZipFile(zipFile); return zf.entries(); } } 使用 public class Test { public static void main(String[] args) throws IOException { ArrayList listFiles = DirTraversal.listFiles("E:\\web"); for (File file : listFiles) { System.out.println(file.getAbsolutePath()); } File zipFile = new File("E:\\web\\file.zip"); ZipUtil.zipFiles(listFiles, zipFile); // File zipFile = new File("E:\\web\\file.zip"); // ZipUtil.zipFiles(listFiles, zipFile, "Hello"); // File zipFile = new File("E:\\web\\file.zip"); // ZipUtil.upZipFile(zipFile, "E:\\web"); } } 三、Apache Commons Compress解压缩

支持ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200, bzip2, 7z, arj, lzma, snappy, DEFLATE, lz4, Brotli and Z files格式。

/** * BZip2解压缩工具类 * @author mazaiting */ public class BZip2Util { /**缓冲字节*/ public static final int BUFFER = 1024; /**后缀名*/ public static final String EXT = ".bz2"; /** * 数据压缩 * @param data 数据字节 * @return * @throws IOException */ public static byte[] compress(byte[] data) throws IOException { ByteArrayInputStream bais = new ByteArrayInputStream(data); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 压缩 compress(bais, baos); byte[] output = baos.toByteArray(); // 从缓冲区刷新数据 baos.flush(); // 关闭流 baos.close(); bais.close(); return output; } /** * 文件压缩 * @param file 文件 * @param delete 是否删除原文件 * @throws IOException */ public static void compress(File file, boolean delete) throws IOException { FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(file.getPath() + EXT); compress(fis, fos); fos.flush(); fos.close(); fis.close(); if (delete) { file.delete(); } } /** * 数据压缩 * @param is 输入流 * @param os 输出流 * @throws IOException */ private static void compress(InputStream is, OutputStream os) throws IOException { BZip2CompressorOutputStream bcos = new BZip2CompressorOutputStream(os); int count; byte data[] = new byte[BUFFER]; while((count = is.read(data, 0, BUFFER)) != -1){ bcos.write(data, 0, count); } bcos.finish(); bcos.flush(); bcos.close(); } /** * 文件压缩 * @param path 文件路径 * @param delete 是否删除原文件 * @throws IOException */ public static void compress(String path, boolean delete) throws IOException{ File file = new File(path); compress(file, delete); } /** * 数据解压缩 * @param data 数据 * @return * @throws IOException */ public static byte[] deCompress(byte[] data) throws IOException{ ByteArrayInputStream bais = new ByteArrayInputStream(data); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 解压缩 deCompress(bais, baos); data = baos.toByteArray(); baos.flush(); baos.close(); bais.close(); return data; } /** * 文件解压缩 * @param file 文件 * @param delete 是否删除源文件 * @throws IOException */ public static void deCompress(File file, boolean delete) throws IOException{ FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(file.getPath().replace(EXT, "")); deCompress(fis, fos); fos.flush(); fos.close(); fis.close(); if (delete) { file.delete(); } } /** * 解压缩 * @param is 输入流 * @param os 输出流 * @throws IOException */ private static void deCompress(InputStream is, OutputStream os) throws IOException { BZip2CompressorInputStream bcis = new BZip2CompressorInputStream(is); int count; byte data[] = new byte[BUFFER]; while((count = bcis.read(data, 0, BUFFER)) != -1){ os.write(data, 0, count); } bcis.close(); } /** * 文件解压缩 * @param path 文件路径 * @param delete 是否删除源文件 * @throws IOException */ public static void deCompress(String path, boolean delete) throws IOException{ File file = new File(path); deCompress(file, delete); } }

上面为BZip2解压缩代码, 若是想用其他格式的解压缩,可以将代码中的BZip2CompressorInputStream 和BZip2CompressorOutputStream相对应的替换就可以。

.ar对应ArArchiveInputStream和ArArchiveOutputStream .cpio对应CpioArchiveInputStream和CpioArchiveOutputStream .dump对应DumpArchiveInputStream .tar对应TarArchiveInputStream和TarArchiveOutputStream .zip对应ZipArchiveInputStream和ZipArchiveOutputStream .gzip对应GzipCompressorInputStream和GzipCompressorOutputStream .xz对应XZCompressorInputStream和XZCompressorOutputStream .pack200对应Pack200CompressorInputStream和Pack200CompressorOutputStream .bzip2对应BZip2CompressorInputStream和BZip2CompressorOutputStream .7z对应SevenZFile和SevenZOutputFile .arj对应ArjArchiveInputStream .lzma对应LZMACompressorInputStream和LZMACompressorOutputStream .snappy对应SnappyCompressorInputStream和SnappyCompressorOutputStream .deflate对应DeflateCompressorInputStream和DeflateCompressorOutputStream .lz4对应BlockLZ4CompressorInputStream和BlockLZ4CompressorOutputStream .brotli 对应BrotliCompressorInputStream .z对应ZCompressorInputStream


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3