tar的解压与压缩

tar的解压与压缩

package com.mtons.mblog.leetcode;


/**
 * import org.apache.tools.tar.TarEntry;
 * import org.apache.tools.tar.TarInputStream;
 * import org.apache.tools.tar.TarOutputStream;
 * 这几个类对应的maven依赖
 * <dependency>
 * <groupId>org.apache.ant</groupId>
 * <artifactId>ant</artifactId>
 * <version>1.8.0</version>
 * </dependency>
 */

import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
import org.apache.tools.tar.TarOutputStream;

import java.io.*;

/**
 * tar的解压与压缩
 */
public class TarUtil {

    public static void main(String[] args) throws Exception {
        TarUtil jtar = new TarUtil();
        jtar.tar(new File("C:/Users/Administrator/Desktop/excel模板.png"),"C:/Users/Administrator/Desktop/_refund_bak.tar");
        jtar.unTar(new File("C:/Users/Administrator/Desktop/_refund_bak.tar"), "C:/Users/Administrator/Desktop/");
    }

    /**
     * 归档tar文件
     *
     * @throws IOException
     */
    public static File tar(File srcFile, String targetFileName) throws IOException {
        File targetTarFile = new File(targetFileName);// 归档后的文件名
        TarOutputStream out = null;
        boolean boo = false;// 是否压缩成功
        try {
            out = new TarOutputStream(new BufferedOutputStream(new FileOutputStream(targetTarFile)));
            tarNext(srcFile, out, "", true);
            boo = true;
            // 归档成功
            return targetTarFile;
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException ex) {
                throw new RuntimeException("关闭Tar输出流出现异常", ex);
            } finally {
                // 清理操作
                if (!boo && targetTarFile.exists())// 归档不成功,
                    targetTarFile.delete();
            }
        }
    }

    /**
     * 解压tar File
     *
     * @param file
     *            要解压的tar文件对象
     * @param outputDir
     *            要解压到某个指定的目录下
     * @throws IOException
     */
    public static File unTar(File file, String outputDir) throws IOException {
        File creatFile = null;
        TarInputStream tarIn = null;
        boolean success = false;
        try {
            if (file.exists() == false) {
                return creatFile;
            }
            tarIn = new TarInputStream(new FileInputStream(file), 1024 * 2);
            createDirectory(outputDir, null);// 创建输出目录
            TarEntry entry = null;
            while ((entry = tarIn.getNextEntry()) != null) {
                if (entry.isDirectory()) {// 是目录
                    createDirectory(outputDir, entry.getName());// 创建空目录
                } else {// 是文件
                    File tmpFile = new File(outputDir + "/" + entry.getName());
                    createDirectory(tmpFile.getParent() + "/", null);// 创建输出目录
                    OutputStream out = null;
                    try {
                        out = new FileOutputStream(tmpFile);
                        int length = 0;
                        byte[] b = new byte[2048];
                        while ((length = tarIn.read(b)) != -1) {
                            out.write(b, 0, length);
                        }
                    } catch (IOException ex) {
                        throw ex;
                    } finally {
                        if (out != null)
                            out.close();
                    }
                }
            }
            success = true;
            creatFile = new File(outputDir);
        } finally {
            try {
                if (tarIn != null) {
                    tarIn.close();
                }
                // if(!success){
                // deleteDirectory(new File(outputDir));
                // }
            } catch (IOException ex) {
                throw new IOException("关闭tarFile出现异常", ex);
            }
        }
        return creatFile;
    }

    /**
     * 归档tar文件
     *
     * @param file
     *            归档的文件对象
     * @param out
     *            输出tar流
     * @param dir
     *            相对父目录名称
     * @param boo
     *            是否把空目录归档进去
     */
    private static void tarNext(File file, TarOutputStream out, String dir, boolean boo) throws IOException {
        if (file.isDirectory()) {// 是目录
            File[] listFile = file.listFiles();// 得出目录下所有的文件对象
            if (listFile.length == 0 && boo) {// 空目录归档
                out.putNextEntry(new TarEntry(dir + file.getName() + "/"));// 将实体放入输出Tar流中
                System.out.println("归档." + dir + file.getName() + "/");
                return;
            } else {
                for (File cfile : listFile) {
                    tarNext(cfile, out, dir + file.getName() + "/", boo);// 递归归档
                }
            }
        } else if (file.isFile()) {// 是文件
            System.out.println("归档." + dir + file.getName() + "/");
            byte[] bt = new byte[2048 * 2];
            TarEntry ze = new TarEntry(dir + file.getName());// 构建tar实体
            // 设置压缩前的文件大小
            ze.setSize(file.length());
            // ze.setName(file.getName());//设置实体名称.使用默认名称
            out.putNextEntry(ze);// //将实体放入输出Tar流中
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
                int i = 0;
                while ((i = fis.read(bt)) != -1) {// 循环读出并写入输出Tar流中
                    out.write(bt, 0, i);
                }
            } catch (IOException ex) {
                throw new IOException("写入归档文件出现异常", ex);
            } finally {
                try {
                    if (fis != null)
                        fis.close();// 关闭输入流
                    out.closeEntry();
                } catch (IOException ex) {
                    throw new IOException("关闭输入流出现异常");
                }
            }
        }
    }

    /**
     * 构建目录
     *
     * @param outputDir
     * @param subDir
     */
    private static void createDirectory(String outputDir, String subDir) {
        File file = new File(outputDir);
        if (!(subDir == null || subDir.trim().equals(""))) {// 子目录不为空
            file = new File(outputDir + "/" + subDir);
        }
        if (!file.exists()) {
            file.mkdirs();
        }
    }

    /**
     * 清理文件(目录或文件)
     *
     * @param file
     */
    private static void deleteDirectory(File file) {
        if (file.isFile()) {
            file.delete();// 清理文件
        } else {
            File list[] = file.listFiles();
            if (list != null) {
                for (File f : list) {
                    deleteDirectory(f);
                }
                file.delete();// 清理目录
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章