@SuppressWarnings("rawtypes" ) public static void unZipFiles(File zipFile,String descDir) throws IOException File pathFile = new File(descDir); if (! pathFile.exists()) pathFile.mkdirs(); // 解决zip文件中有中文目录或者中文文件 ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK" )); for (Enumeration entries = zip.entries(); entries.hasMoreElements();) ZipEntry entry = (ZipEntry)entries.nextElement(); String zipEntryName = entry.getName(); InputStream in = zip.getInputStream(entry); String outPath = (descDir+zipEntryName).replaceAll("\\*", "/" );; // 判断路径是否存在,不存在则创建文件路径 File file = new File(outPath.substring(0, outPath.lastIndexOf('/' ))); if (! file.exists()) file.mkdirs(); // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 if ( new File(outPath).isDirectory()) continue ; // 输出文件路径信息 System.out.println(outPath); OutputStream out = new FileOutputStream(outPath); byte [] buf1 = new byte [1024 ]; int len; while ((len=in.read(buf1))>0 ) out.write(buf1, 0 ,len); in.close(); out.close(); System.out.println( "******************解压完毕********************" );

解压tar.gz 文件

package com.hou;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
 * 解压tar.gz 文件 
 * ClassName: Test01 
 * @Description: TODO
 * @author HJJ
 * @date 2018年10月17日
public class Test01 {
    public static void main(String[] args) {
        File file=new File("D:/home/app/data/tiantai/new/pred_2018-10-15.tar.gz");
        String str="D:/home/app/data/tiantai/new/";
        try {
            unTarGz(file,str);
            System.out.println("解压成功");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
  //------------------------------------------------------------------------------------------------------
     * 解压tar.gz 文件 
     * @param file 要解压的tar.gz文件对象 
     * @param outputDir 要解压到某个指定的目录下 
     * @throws IOException 
    public static void unTarGz(File file,String outputDir) throws IOException{  
        TarInputStream tarIn = null;  
        try{  
            tarIn = new TarInputStream(new GZIPInputStream(  
                    new BufferedInputStream(new FileInputStream(file))),  
                    1024 * 2);  
            createDirectory(outputDir,null);//创建输出目录  
            TarEntry entry = null;  
            while( (entry = tarIn.getNextEntry()) != null ){  
                if(entry.isDirectory()){//是目录
                    entry.getName();
                    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();  
        }catch(IOException ex){  
            throw new IOException("解压归档文件出现异常",ex);  
        } finally{  
            try{  
                if(tarIn != null){  
                    tarIn.close();  
            }catch(IOException ex){  
                throw new IOException("关闭tarFile出现异常",ex);  
     * 构建目录 
     * @param outputDir 
     * @param subDir 
    public 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()){  
              if(!file.getParentFile().exists())
                  file.getParentFile().mkdirs();
            file.mkdirs();  

3.解压指定目录下的zip文件

* 解压指定目录下的zip文件 *
@param checkPath 检测目录,先从缓存中取,如果缓存中不存在,再从配置文件中提取 * @param fileName 待解压的zip文件 * @throws Exception private static void unzip(String checkPath,String fileName) throws Exception { if (checkPath.startsWith("~")) { checkPath = System.getProperty("user.home")+ checkPath.substring(1); // final String currentPath = checkPath; final String currentPath = "D:/home/app/data/tiantai/new/"; // String fileRoot = checkPath + File.separator + fileName; //zip文件路径 String fileRoot = "D:/home/app/data/tiantai/new/QUNAR_ONE_COMMON_PRYPAY_1539141468602.zip"; //zip文件路径 //System.out.println("解压的zip文件 fileRoot:" + fileRoot); System.out.println("解压的zip文件 fileRoot:" + fileRoot); FileSystem fs = FileSystems.newFileSystem(Paths.get(fileRoot),null); Files.walkFileTree(fs.getPath("/"),new SimpleFileVisitor<Path>(){ //遍历文件系统时,可获取文件属性 * Invoked for a file in a directory. * <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE * CONTINUE}. * @param file * @param attrs @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Path destPath = Paths.get(currentPath,file.toString()); Files.deleteIfExists(destPath);//如果目标文件已经存在,则删除 Files.createDirectories(destPath.getParent());//创建文件的父目录,不管是文件还是目录 Files.move(file, destPath); return FileVisitResult.CONTINUE; fs.close();//关闭文件系统 //文件解压成功后,删除zip文件 File delZipFile = new File(fileRoot); if(delZipFile.exists() && delZipFile.isFile()){ boolean d = delZipFile.delete(); if(d){ // System.out.println(fileRoot + " 文件已删除..."); System.out.println((fileRoot + " 文件已删除..."));
public static void Decompressing2() throws IOException {
//        String path = "D:/home/app/data/tiantai/new/";
        String path = "D:/home/app/data/tiantai/new/";
        ZipEntry zipEntry = null;
        try {
            // ZipInputStream读取压缩文件
            FileInputStream file=new FileInputStream(new File(path+"QUNAR_ONE_COMMON_PRYPAY_1539679543536.zip"));
//            ZipFile zipFile = new ZipFile(new File(path+"QUNAR_ONE_COMMON_PRYPAY_1539141468602.zip"),Charset.forName("gbk")) ;
            ZipInputStream zipInputStream = new ZipInputStream(file);
            // 写入到缓冲流中
            BufferedInputStream bufferedInputStream = new BufferedInputStream(zipInputStream);
            File fileOut = null;
            // 读取压缩文件中的一个文件
//            zipEntry = zipInputStream.getNextEntry();
            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
                // 若当前zipEntry是一个文件夹
                if (zipEntry.isDirectory()) {
                    fileOut = new File(path + "//" +zipEntry.getName());
                    // 在指定路径下创建文件夹
                    if (!fileOut.exists()) {
                        fileOut.mkdirs();                       
                //若是文件
                } else {
                    // 原文件名与指定路径创建File对象(解压后文件的对象)
                    fileOut = new File(path, zipEntry.getName());
                    try(
                            FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
                            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);){
                        //将文件写入到指定file中
                        int b = 0;
                        while ((b = bufferedInputStream.read()) != -1) {
                            bufferedOutputStream.write(b);
                    }catch (Exception e) {
                        e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
readByZipInputStream("D:/home/app/data/tiantai/new/QUNAR_ONE_COMMON_PRYPAY_1539065367654.zip", "d:/");
public static void readByZipInputStream(String archive, String decompressDir)  
            throws FileNotFoundException, IOException {  
        BufferedInputStream bi;  
        ZipFile zf = new ZipFile(archive, Charset.forName("gbk"));//支持中文  
        Enumeration e = zf.entries();  
        while (e.hasMoreElements()) {  
            ZipEntry ze2 = (ZipEntry) e.nextElement();  
            String entryName = ze2.getName();  
            String path = decompressDir + "/" + entryName;  
            if (ze2.isDirectory()) {  
                System.out.println("正在创建解压目录 - " + entryName);  
                File decompressDirFile = new File(path);  
                if (!decompressDirFile.exists()) {  
                    decompressDirFile.mkdirs();  
            } else {  
                System.out.println("正在创建解压文件 - " + entryName);  
                String fileDir = path.substring(0, path.lastIndexOf("/"));  
                File fileDirFile = new File(fileDir);  
                if (!fileDirFile.exists()) {  
                    fileDirFile.mkdirs();  
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(  
                        decompressDir + "/" + entryName));  
                bi = new BufferedInputStream(zf.getInputStream(ze2));  
                byte[] readContent = new byte[1024];  
                int readCount = bi.read(readContent);  
                while (readCount != -1) {  
                    bos.write(readContent, 0, readCount);  
                    readCount = bi.read(readContent);  
                bos.close();  
        zf.close();  

6.修改文件名

* 通过文件路径直接修改文件名 *
@param filePath 需要修改的文件的完整路径 * @param newFileName 需要修改的文件的名称 * @return public static String FixFileName(String filePath, String newFileName) { File f = new File(filePath); if (!f.exists()) { // 判断原文件是否存在 return null; newFileName = newFileName.trim(); if ("".equals(newFileName) || newFileName == null) // 文件名不能为空 return null; String newFilePath = null; if (f.isDirectory()) { // 判断是否为文件夹 newFilePath = filePath.substring(0, filePath.lastIndexOf("/")) + "/" + newFileName; } else { newFilePath = filePath.substring(0, filePath.lastIndexOf("/"))+ "/" + newFileName ; File nf = new File(newFilePath); if (!f.exists()) { // 判断需要修改为的文件是否存在(防止文件名冲突) return null; try { f.renameTo(nf); // 修改文件名 } catch(Exception err) { err.printStackTrace(); return null; return newFilePath;