java使用tar算法压缩解压缩文件、数据流、byte[]字节数组
来源:互联网 发布:毕业生户口迁移 知乎 编辑:程序博客网 时间:2024/06/10 09:40
全栈工程师开发手册 (作者:栾鹏)
java教程全解
java使用tar算法压缩解压缩文件、数据流、byte[]字节数组
需要添加org.apache.commons.compress包,下载
测试代码
public static void main(String[] args) { try { String inputStr="111111111111111111111111111111111"; //压缩文件测试 byte[] contentOfEntry = inputStr.getBytes(); FileOutputStream fos = new FileOutputStream("test.txt"); fos.write(contentOfEntry); fos.flush(); fos.close(); //压缩文件 TarUtils.archive("test.txt"); //解压缩文件 TarUtils.dearchive("test.txt" + ".tar"); File file = new File("test.txt"); FileInputStream fis = new FileInputStream(file); DataInputStream dis = new DataInputStream(fis); byte[] data = new byte[(int) file.length()]; dis.readFully(data); fis.close(); String outputStr = new String(data); System.out.println(outputStr); //测试压缩目录 String path = "d:/srcdir"; TarUtils.archive(path); TarUtils.dearchive(path + ".tar", "d:/desdir"); } catch (Exception e) { e.printStackTrace(); } }
tar压缩解压缩工具类的实现
package com.lp.app.io;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; //TAR工具 public class TarUtils { private static final String BASE_DIR = ""; // 符号"/"用来作为目录标识判断符 private static final String PATH = "/"; //归档 public static void archive(String srcPath, String destPath) throws Exception { File srcFile = new File(srcPath); archive(srcFile, destPath); } //归档 public static void archive(File srcFile, File destFile) throws Exception { TarArchiveOutputStream taos = new TarArchiveOutputStream(new FileOutputStream(destFile)); archive(srcFile, taos, BASE_DIR); taos.flush(); taos.close(); } //归档 public static void archive(File srcFile) throws Exception { String name = srcFile.getName(); String basePath = srcFile.getParent(); String destPath = basePath +"\\"+ name + ".tar"; if (basePath==null) { destPath = name + ".tar"; } archive(srcFile, destPath); } //归档文件 public static void archive(File srcFile, String destPath) throws Exception { archive(srcFile, new File(destPath)); } //归档 public static void archive(String srcPath) throws Exception { File srcFile = new File(srcPath); archive(srcFile); } //归档 private static void archive(File srcFile, TarArchiveOutputStream taos, String basePath) throws Exception { if (srcFile.isDirectory()) { archiveDir(srcFile, taos, basePath); } else { archiveFile(srcFile, taos, basePath); } } //目录归档 private static void archiveDir(File dir, TarArchiveOutputStream taos, String basePath) throws Exception { File[] files = dir.listFiles(); if (files.length < 1) { TarArchiveEntry entry = new TarArchiveEntry(basePath+ dir.getName() + PATH); taos.putArchiveEntry(entry); taos.closeArchiveEntry(); } for (File file : files) { // 递归归档 archive(file, taos, basePath + dir.getName() + PATH); } } //数据归档 private static void archiveFile(File file, TarArchiveOutputStream taos, String dir) throws Exception { /** * 归档内文件名定义 * * <pre> * 如果有多级目录,那么这里就需要给出包含目录的文件名 * 如果用WinRAR打开归档包,中文名将显示为乱码 * </pre> */ TarArchiveEntry entry = new TarArchiveEntry(dir + file.getName()); entry.setSize(file.length()); taos.putArchiveEntry(entry); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); int count; byte data[] = new byte[1024]; while ((count = bis.read(data, 0, 1024)) != -1) { taos.write(data, 0, count); } bis.close(); taos.closeArchiveEntry(); } //解归档 public static void dearchive(File srcFile) throws Exception { String basePath = srcFile.getParent(); if (basePath==null) { basePath=""; } dearchive(srcFile, basePath); } //解归档 public static void dearchive(File srcFile, File destFile) throws Exception { TarArchiveInputStream tais = new TarArchiveInputStream(new FileInputStream(srcFile)); dearchive(destFile, tais); tais.close(); } //解归档 public static void dearchive(File srcFile, String destPath)throws Exception { dearchive(srcFile, new File(destPath)); } //文件 解归档 private static void dearchive(File destFile, TarArchiveInputStream tais) throws Exception { TarArchiveEntry entry = null; while ((entry = tais.getNextTarEntry()) != null) { // 文件 String dir = destFile.getPath() + File.separator + entry.getName(); File dirFile = new File(dir); // 文件检查 fileProber(dirFile); if (entry.isDirectory()) { dirFile.mkdirs(); } else { dearchiveFile(dirFile, tais); } } } //文件 解归档 public static void dearchive(String srcPath) throws Exception { File srcFile = new File(srcPath); dearchive(srcFile); } //文件 解归档 public static void dearchive(String srcPath, String destPath) throws Exception { File srcFile = new File(srcPath); dearchive(srcFile, destPath); } //文件解归档 private static void dearchiveFile(File destFile, TarArchiveInputStream tais) throws Exception { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); int count; byte data[] = new byte[1024]; while ((count = tais.read(data, 0, 1024)) != -1) { bos.write(data, 0, count); } bos.close(); } //文件探针 ,当父目录不存在时,创建目录! private static void fileProber(File dirFile) { File parentFile = dirFile.getParentFile(); if (!parentFile.exists()) { // 递归寻找上级目录 fileProber(parentFile); parentFile.mkdir(); } } }
阅读全文
0 0
- java使用tar算法压缩解压缩文件、数据流、byte[]字节数组
- java使用BZip算法压缩解压缩文件、数据流、byte[]字节数组
- java实现zlib压缩解压缩:文件、byte[]字节数组,数据流
- java实现linux中gzip压缩解压缩算法:byte[]字节数组,文件,字符串,数据流的压缩解压缩
- c#实现linux中gzip压缩解压缩算法:byte[]字节数组,文件,字符串,数据流的压缩解压缩
- java压缩解压缩rar、zip 、tar文件 工具类源码
- tar.xz文件如何压缩与解压缩
- java 压缩解压缩文件
- java压缩、解压缩文件
- Java 压缩/解压缩 文件
- 压缩及解压缩命令tar的使用
- 获取文件字节数组byte[]
- java对象与byte[]数组之间的相互转化,压缩解压缩操作
- tar压缩解压缩
- tar 压缩解压缩
- tar压缩/解压缩
- tar压缩与解压缩
- tar压缩与解压缩
- verilog简单驱动sram
- 给你的大杀器装备核弹——Windows下安装使用GPU版XGBoot详细参考指南
- 35.笔记go语言——array、slices和map
- URAL 1083|Factorials!!!|暴力
- 用C语言写的一个简单的将数字金钱转换为文字
- java使用tar算法压缩解压缩文件、数据流、byte[]字节数组
- 36.笔记go语言——函数
- data augmentation and dropout
- 37.笔记go语言——包
- 【字符串】【Trie】lcp 题解
- 38.笔记go语言——进阶
- isabellezhou 图解二叉树遍历(递归调用)
- 39.笔记go语言——接口
- 【Linux入门学习之】vi/vim编辑器必知必会