java对tar、zip包的相关操作

package com.mash5.web.services.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import org.bson.types.ObjectId;

import com.ice.tar.TarEntry;
import com.ice.tar.TarInputStream;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
public class ParseTar_Zip_Jar {

/**
 * 解压tar包
 * @param tarPath
 * @param basePath
 * @return
 */
public static File getFileListByTarPath(String tarPath, String basePath) {
    if(tarPath == null) return null;
    try {
        OutputStream out =  null;
        TarEntry entry = null;
        TarInputStream tar = new TarInputStream(new FileInputStream(new File(tarPath)));
        File returnFile = null;
        int i = 0;
        while((entry = tar.getNextEntry()) != null) {
            if(i == 0) {
                File outFile = new File(basePath + entry.getName());
                outFile.mkdir();
                returnFile = outFile;
            }
            i ++;
            if(entry.isDirectory()) {
                continue;
            }
            File outFile = new File(basePath + entry.getName());
            new File(outFile.getParent()).mkdirs();
            out = new FileOutputStream(outFile);
            int data = -1;
            while((data = tar.read()) != -1) {
                out.write(data);
            }
            out.close();
        }
        tar.close();
        return returnFile;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 解压Zip包
 * @param zipPath
 * @param basePath
 * @return
 */
public static File getFileListByZipPath(String zipPath, String basePath) {
    if(zipPath == null || "".equals(zipPath)) return null;
    try {
        ZipInputStream in = new ZipInputStream(new FileInputStream(new File(zipPath)));
        ZipEntry entry = null;
        OutputStream out = null;
        File returnFile = null;
        int i = 0;
        while((entry = in.getNextEntry()) != null) {
            if(i == 0) {
                File outFile = new File(basePath + entry.getName());
                returnFile = outFile;
            }
            i ++;
            if(entry.isDirectory()) {
                continue;
            }
            File outFile = new File(basePath + entry.getName());
            //创建他的父文件夹
            new File(outFile.getParent()).mkdirs();
            out = new FileOutputStream(outFile);
            int data = -1;
            while((data = in.read()) != -1) {
                out.write(data);
            }
            out.close();
        }
        in.close();
        return returnFile;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 解压Zip包
 * @param zipPath
 * @param basePath
 * @return
 */
public static List<GridFSDBFile> getFilesByFSZip(GridFSDBFile file, GridFS myFS) {
    if(file == null || "".equals(file)) return null;
    List<GridFSDBFile> files = new ArrayList<GridFSDBFile>();

    try {
        ZipInputStream zis = new ZipInputStream(file.getInputStream());
        ZipEntry entry = null;
        while(( entry = zis.getNextEntry()) != null) {
            if(entry.isDirectory()) continue;
            GridFSInputFile inputFile  = myFS.createFile(zis);
            inputFile.setFilename(entry.getName());
            inputFile.setContentType(file.getMD5());
            inputFile.save();
            System.out.println(entry.getName()+","+inputFile.getId().toString());
            ObjectId fileId = new ObjectId(inputFile.getId().toString());
            GridFSDBFile fileObj = myFS.find(fileId);
            files.add(fileObj);
        }

        zis.close();
        return files;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}


public static void zipFS(List<GridFSDBFile> fileList,String zipFileName) throws Exception{
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));
    for(GridFSDBFile file : fileList){
        zipFS(zos, file);
    }
    zos.close();
}

/**
 * @param zipFileName
 *            生成的压缩文件夹路径
 * @param filePath
 *            源文件夹
 * @throws FileNotFoundException
 * @throws IOException
 */

public static void zip(String zipFileName, List<String> filePath) throws FileNotFoundException, IOException {
    ZipOutputStream zos = null;
    zos = new ZipOutputStream(new FileOutputStream(zipFileName));
    boolean has=false;
    for(String str : filePath) {
        File f=new File(str);
        if(f.exists()){
            has=true;
            zip(zos, f, "");
        }
    }
    if(!has)zos.putNextEntry(new ZipEntry(""));
    zos.close();
}

public static void zip(String zipFileName){
    ZipOutputStream zos = null;
    try {
        zos = new ZipOutputStream(new FileOutputStream(zipFileName));
        zos.putNextEntry(new ZipEntry(""));
        zos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void zipFS (ZipOutputStream zos, GridFSDBFile file) throws Exception {
    InputStream is = file.getInputStream();
    BufferedInputStream bis =  new BufferedInputStream(is);
    zos.putNextEntry(new ZipEntry(file.getFilename()));
    int length = 0;
    byte[] buffer = new byte[1024 * 1024];
    while ((length = bis.read(buffer)) != -1) {
        zos.write(buffer, 0, length);
        zos.flush();
    }
    is.close();
    bis.close();
}

/**
 * 
 * @param zos
 * @param f
 *            源文件夹
 * @param base
 * @throws FileNotFoundException
 * @throws IOException
 */
private static void zip(ZipOutputStream zos, File f, String base) throws FileNotFoundException, IOException {
    BufferedInputStream bis = null;
    FileInputStream fis = null;
    if (f.isDirectory()) {
        File[] files = f.listFiles();
        if(base.equals("")){
            base=f.getName()+"/";
        } else {
            base=base+"/";
        }
        zos.putNextEntry(new ZipEntry(base));
        for (int i = 0; i < files.length; i++) {
            zip(zos, files[i], base + files[i].getName());
        }
    } else {
        if(base.equals("")){
            base=f.getName();
        }
        zos.putNextEntry(new ZipEntry(base));
        fis = new FileInputStream(f);
        bis = new BufferedInputStream(fis);
        byte[] b = new byte[1024 * 1024];
        int len = 0;
        while ((len = bis.read(b)) != -1) {
            zos.write(b, 0, len);
            zos.flush();
        }
        fis.close();
        bis.close();
    }
}

public static void main(String[] args) throws Exception {
    Mongo db = new Mongo("192.168.3.171", 30000);  
    DB mydb = db.getDB("mash5");  

    GridFS myFS = new GridFS(mydb); 

    //打包文件 
    /*
    List<GridFSDBFile> fileList = new ArrayList<GridFSDBFile>();

    ObjectId fileId = new ObjectId("54bf1389fffe27eced2f5e7f");
    GridFSDBFile file = myFS.find(fileId);
    fileList.add(file);

    ObjectId fileId1 = new ObjectId("54bdbe2ba43e5ada8d875439");
    GridFSDBFile file1 = myFS.find(fileId1);
    fileList.add(file1);

    ObjectId fileId2 = new ObjectId("54bdb6b1a43ee44e955eec45");
    GridFSDBFile file2 = myFS.find(fileId2);
    fileList.add(file2);

    zipFS(fileList, "D:/0203-zh.rar");
    */

    //解压包

    ObjectId fileId = new ObjectId("54d1dd6bfe1cae7da80f6b68");
    GridFSDBFile file = myFS.find(fileId);
    List<GridFSDBFile> fileList = ParseTar_Zip_Jar.getFilesByFSZip(file, myFS);
    for(GridFSDBFile fileObj : fileList){
        InputStream is = fileObj.getInputStream();
        String fileName = fileObj.getFilename();
        int lastIndex = fileName.lastIndexOf("/");
        fileName = fileName.substring(lastIndex+1, fileName.length());
        FileOutputStream out = new FileOutputStream(new File("D:/test/"+fileName));
        //设置缓存;
        int length = 0;
        byte[] buffer = new byte[1024000];
        while ((length = is.read(buffer)) != -1) {
            out.write(buffer, 0, length);
        }
        // 关闭对应的流
        out.flush();
        is.close();
        out.close();        

    }

    //解压tar包成功

// List fileList = ParseTar_Zip_Jar.getFileListByTarPath(“e:/WEB-INF.tar”, “e:/a/”);
// for(File f : fileList) {
// System.out.println(f.getAbsolutePath());
// }

    //解压zip包成功
    //ParseTar_Zip_Jar.getFileListByZipPath("f:/my.zip", "f:/my/");

// for(File f : fileList) {
// System.out.println(f.getAbsolutePath());
// }

// File f = new File(“e:/WEB-INF.tar”);
// System.out.println(f.length());

// List filePathList = new ArrayList();
// filePathList.add(“F:\a”);
// filePathList.add(“F:\b”);
// ParseTar_Zip_Jar.getTarByFileList(filePathList);
// System.out.println(new Date().toLocaleString());

    //List<String> filePathList = new ArrayList<String>();

// filePathList.add(“f:/a/a/a.txt”);
// filePathList.add(“f:/c.txt”);
// try {
// ParseTar_Zip_Jar.zip(“F:/my.zip”, filePathList);
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值