diff options
Diffstat (limited to 'src/com/nis/nmsclient/util/GzipUtil.java')
| -rw-r--r-- | src/com/nis/nmsclient/util/GzipUtil.java | 680 |
1 files changed, 680 insertions, 0 deletions
diff --git a/src/com/nis/nmsclient/util/GzipUtil.java b/src/com/nis/nmsclient/util/GzipUtil.java new file mode 100644 index 0000000..75dce1b --- /dev/null +++ b/src/com/nis/nmsclient/util/GzipUtil.java @@ -0,0 +1,680 @@ +package com.nis.nmsclient.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import org.apache.commons.io.IOUtils; +import org.apache.log4j.Logger; + +import com.ice.tar.TarEntry; +import com.ice.tar.TarInputStream; +import com.ice.tar.TarOutputStream; +import com.nis.nmsclient.common.Contants; + +/** + * gzip文件压缩与解压缩,对文件tar归档与解归档工具类 + * + */ +public class GzipUtil { + static Logger logger = Logger.getLogger(GzipUtil.class); + + /** + * 使用命令对单个gz压缩包解压 + * @param srcFileStr 需要解压的gz文件 + * @param destDir 解压后的目标路径 + * @param isAbs 解压文件时 true 按绝对路径解压, false 进入目标路径后解压 + * @throws Exception + */ + public static void unGzipByCmd(String srcFileStr, String destDir, boolean isAbs) throws Exception{ + logger.debug("unGzip start……"); + BufferedReader bReader = null; + BufferedReader errorReader = null; + Process process = null; + try { + logger.debug("unGzipByCmd srcFile---" + srcFileStr); + logger.debug("unGzipByCmd destDir---" + destDir); + + File srcFile = new File(srcFileStr); + File descFile = new File(destDir); + if(!srcFile.exists()){ + throw new Exception("source file not exist"); + } + if(!srcFile.isFile()){ + throw new Exception("source file is not a file"); + } + if(!descFile.exists()){ + descFile.mkdirs(); + } + if(!descFile.isDirectory()){ + throw new Exception("compress destination path is not a directory"); + } + String tarFile = srcFile.getParent() + File.separator + srcFile.getName().substring(0, srcFile.getName().length()-3); + StringBuffer sb = new StringBuffer(); + sb.append("gunzip " + srcFileStr); + sb.append(";tar xvpPf " + tarFile); + if(!isAbs){ + sb.append(" -C " + destDir); + }else{ + sb.append(" -C /"); + } + sb.append(";gzip " + tarFile); + logger.debug("unGzipByCmd cmd--->" + sb.toString()); + + String[] shellCmd = new String[] { "/bin/bash", "-c", sb.toString() }; + process = Runtime.getRuntime().exec(shellCmd); + process.getOutputStream().close(); + + bReader = new BufferedReader(new InputStreamReader(process + .getInputStream())); + errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String line = null; + while ((line = bReader.readLine()) != null) { + logger.debug("unGzipByCmd--->" + line); + } + while ((line = errorReader.readLine()) != null) { + logger.debug("unGzipByCmd error--->" + line); + throw new IOException(line); + } + + logger.debug("unGzipByCmd end……"); + } catch (Exception e) { + throw e; + } finally { + try { + if (bReader != null) { + bReader.close(); + } + if (errorReader != null) { + errorReader.close(); + } + if (process != null) { + process.destroy(); + } + } catch (Exception e) { + } + } + + } + + /** + * 使用命令将单个文件或一个目录压缩成Gzip格式 + * @param srcPath 需要压缩的文件目录或文件 + * @param destFileStr 压缩后的目标文件 + * @param excludes 排除的目录或文件(全是绝对路径),不包含到压缩包的 + * @param isAbs 压缩文件时 true 按绝对路径压缩(含有完成的路径压缩包), false 进入目标路径后压缩 + * @throws Exception + */ + public static void gzipByCmd(String srcPath, String destFileStr, String[] excludes, boolean isAbs) throws Exception{ + logger.debug("gzipByCmd start……"); + OutputStreamWriter fos = null; + BufferedReader bReader = null; + BufferedReader errorReader = null; + Process process = null; + File excludeFile = null; + boolean flag = true; + try { + logger.debug("gzipByCmd srcPath---" + srcPath); + logger.debug("gzipByCmd destFileStr---" + destFileStr); + + File srcFile = new File(srcPath); + File descFile = new File(destFileStr); + if(!srcFile.exists()){ + throw new Exception("decompress file not exist"); + } + if(!descFile.getParentFile().exists()){ + descFile.getParentFile().mkdirs(); + } + StringBuffer sb = new StringBuffer(); + if(!isAbs){ + if(srcFile.isFile()){ + sb.append("cd " + srcFile.getParentFile().getCanonicalPath() + ";"); + }else{ + sb.append("cd " + srcFile.getCanonicalPath() + ";"); + } + } + sb.append("tar -czvpPf " + destFileStr); + if(excludes!=null && excludes.length>0){ + if(!isAbs){ + for (int i = 0; i < excludes.length; i++) { + int index = excludes[i].indexOf(srcFile + .getCanonicalPath()); + logger.debug("gzipByCmd index--->" + index + "---src=" +srcFile + .getCanonicalPath()); + int start = index + srcFile.getCanonicalPath().length() + 1; + logger.debug("gzipByCmd start--->" + start + "--length=" + excludes[i].length() +"---exclude=" + excludes[i]); + if (index != -1 && start <= excludes[i].length()) { + excludes[i] = excludes[i].substring(start, + excludes[i].length()); + logger.debug("gzipByCmd exclude--->" + excludes[i]); + } + } + } + excludeFile = new File(Contants.localTempPath + File.separator + "excludelist_" + System.currentTimeMillis() + ".temp"); + // 2012-11-21 修改 由于使用FileWrUtil写的文件(有文件头的),Linux下无法正确识别 + fos = new OutputStreamWriter( + new FileOutputStream(excludeFile, true), System.getProperty("file.encoding")); + logger.debug("gzipByCmd ---- " + System.getProperty("file.encoding")); + for(String val : excludes){ + fos.write(val); + fos.write("\n"); + } + fos.flush(); + //FileWrUtil.cfgFilePrinter(excludeFile, Contants.charset, excludes); + sb.append(" -X " + excludeFile.getCanonicalPath()); + } + if(!isAbs){ + if(srcFile.isFile()){ + sb.append(" " + srcFile.getName()); + }else{ + sb.append(" *"); + } + }else{ + sb.append(" " + srcFile.getCanonicalPath()); + } + logger.debug("gzipByCmd cmd--->" + sb.toString()); + + String[] shellCmd = new String[] { "/bin/bash", "-c", sb.toString() }; + process = Runtime.getRuntime().exec(shellCmd); + process.getOutputStream().close(); + + bReader = new BufferedReader(new InputStreamReader(process + .getInputStream())); + errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String line = null; + while ((line = bReader.readLine()) != null) { + logger.debug("gzipByCmd--->" + line); + } + while ((line = errorReader.readLine()) != null) { + logger.debug("gzipByCmd error--->" + line); + flag = false; + throw new IOException(line); + } + + logger.debug("gzipByCmd end……"); + } catch (Exception e) { + throw e; + } finally { + try { + if(fos!=null){ + fos.close(); + } + if(excludeFile!=null && excludeFile.exists()){ + //excludeFile.delete_bak(); + //使用删除文件公共方法 + FileUtil.delDir(excludeFile); + logger.debug("GzipUtil.gzipByCmd()--delete excludeFile=" + excludeFile.getAbsolutePath()); + //FileUtil.checkParentDirExist(excludeFile); + } + if (bReader != null) { + bReader.close(); + } + if (errorReader != null) { + errorReader.close(); + } + if (process != null) { + process.destroy(); + } + if(!flag){ + File destFile = new File(destFileStr); + if(destFile.exists()){ + //destFile.delete_bak(); + //使用删除文件公共方法 + FileUtil.delDir(destFile); + logger.debug("GzipUtil.gzipByCmd()--delete destFile=" + destFile.getAbsolutePath()); + //FileUtil.checkParentDirExist(destFile); + } + } + } catch (Exception e) { + } + } + + } + + /** + * 使用命令对单个tar压缩包解压 + * @param srcFileStr 需要解压的gz文件 + * @param destDir 解压后的目标路径 + * @param isAbs 解压文件时 true 按绝对路径解压, false 进入目标路径后解压 + * @throws Exception + */ + public static void unTarByCmd(String srcFileStr, String destDir, boolean isAbs) throws Exception{ + logger.debug("unTarByCmd start……"); + BufferedReader bReader = null; + BufferedReader errorReader = null; + Process process = null; + try { + logger.debug("unTarByCmd srcFile---" + srcFileStr); + logger.debug("unTarByCmd destDir---" + destDir); + + File srcFile = new File(srcFileStr); + File descFile = new File(destDir); + if(!srcFile.exists()){ + throw new Exception("source file not exist"); + } + if(!srcFile.isFile()){ + throw new Exception("source file is not a file"); + } + if(!descFile.exists()){ + descFile.mkdirs(); + } + if(!descFile.isDirectory()){ + throw new Exception("compress destination path is not a directory"); + } + StringBuffer sb = new StringBuffer(); + sb.append("tar xvpPf " + srcFileStr); + if(!isAbs){ + sb.append(" -C " + destDir); + }else{ + sb.append(" -C /"); + } + logger.debug("unTarByCmd cmd--->" + sb.toString()); + + String[] shellCmd = new String[] { "/bin/bash", "-c", sb.toString() }; + process = Runtime.getRuntime().exec(shellCmd); + process.getOutputStream().close(); + + bReader = new BufferedReader(new InputStreamReader(process + .getInputStream())); + errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String line = null; + while ((line = bReader.readLine()) != null) { + logger.debug("unTarByCmd--->" + line); + } + while ((line = errorReader.readLine()) != null) { + logger.debug("unTarByCmd--->" + line); + throw new IOException(line); + } + + logger.debug("unTarByCmd end……"); + } catch (Exception e) { + throw e; + } finally { + try { + if (bReader != null) { + bReader.close(); + } + if (errorReader != null) { + errorReader.close(); + } + if (process != null) { + process.destroy(); + } + } catch (Exception e) { + } + } + + } + + /** + * 使用命令将单个文件或一个目录压缩成tar格式 + * @param srcPath 需要压缩的文件目录或文件 + * @param destFileStr 压缩后的目标文件 + * @param excludes 排除的目录或文件(全是绝对路径),不包含到压缩包的 + * @param isAbs 压缩文件时 true 按绝对路径压缩(含有完成的路径压缩包), false 进入目标路径后压缩 + * @throws Exception + */ + public static void tarByCmd(String srcPath, String destFileStr, String[] excludes, boolean isAbs) throws Exception{ + logger.debug("tarByCmd start……"); + BufferedReader bReader = null; + BufferedReader errorReader = null; + Process process = null; + File excludeFile = null; + boolean flag = true; + try { + logger.debug("tarByCmd srcPath---" + srcPath); + logger.debug("tarByCmd destFileStr---" + destFileStr); + + File srcFile = new File(srcPath); + File descFile = new File(destFileStr); + if(!srcFile.exists()){ + throw new Exception("decompress file not exist"); + } + if(!descFile.getParentFile().exists()){ + descFile.getParentFile().mkdirs(); + } + StringBuffer sb = new StringBuffer(); + if(!isAbs){ + if(srcFile.isFile()){ + sb.append("cd " + srcFile.getParentFile().getCanonicalPath() + ";"); + }else{ + sb.append("cd " + srcFile.getCanonicalPath() + ";"); + } + } + sb.append("tar -cvpPf " + destFileStr); + if(excludes!=null && excludes.length>0){ + if(!isAbs){ + for (int i = 0; i < excludes.length; i++) { + int index = excludes[i].indexOf(srcFile + .getCanonicalPath()); + logger.debug("tarByCmd index--->" + index + "---src=" +srcFile + .getCanonicalPath()); + int start = index + srcFile.getCanonicalPath().length() + 1; + logger.debug("tarByCmd start--->" + start + "--length=" + excludes[i].length() +"---exclude=" + excludes[i]); + if (index != -1 && start <= excludes[i].length()) { + excludes[i] = excludes[i].substring(start, + excludes[i].length()); + logger.debug("tarByCmd exclude--->" + excludes[i]); + } + } + } + excludeFile = new File(Contants.localTempPath + File.separator + "excludelist_" + System.currentTimeMillis() + ".temp"); + FileWrUtil.cfgFilePrinter(excludeFile, Contants.charset, excludes); + sb.append(" -X " + excludeFile.getCanonicalPath()); + } + if(!isAbs){ + if(srcFile.isFile()){ + sb.append(" " + srcFile.getName()); + }else{ + sb.append(" *"); + } + }else{ + sb.append(" " + srcFile.getCanonicalPath()); + } + logger.debug("tarByCmd cmd--->" + sb.toString()); + + String[] shellCmd = new String[] { "/bin/bash", "-c", sb.toString() }; + process = Runtime.getRuntime().exec(shellCmd); + process.getOutputStream().close(); + + bReader = new BufferedReader(new InputStreamReader(process + .getInputStream())); + errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String line = null; + while ((line = bReader.readLine()) != null) { + logger.debug("tarByCmd--->" + line); + } + while ((line = errorReader.readLine()) != null) { + logger.debug("tarByCmd error--->" + line); + flag = false; + throw new IOException(line); + } + + logger.debug("tarByCmd end……"); + } catch (Exception e) { + throw e; + } finally { + try { + if(excludeFile!=null && excludeFile.exists()){ + //excludeFile.delete_bak(); + //使用删除文件公共方法 + FileUtil.delDir(excludeFile); + logger.debug("GzipUtil.tarByCmd()--delete excludeFile=" + excludeFile.getAbsolutePath()); + //FileUtil.checkParentDirExist(excludeFile); + } + if (bReader != null) { + bReader.close(); + } + if (errorReader != null) { + errorReader.close(); + } + if (process != null) { + process.destroy(); + } + if(!flag){ + File destFile = new File(destFileStr); + if(destFile.exists()){ + //destFile.delete_bak(); + //使用删除文件公共方法 + FileUtil.delDir(destFile); + logger.debug("GzipUtil.tarByCmd()--delete destFile=" + destFile.getAbsolutePath()); + //FileUtil.checkParentDirExist(destFile); + } + } + } catch (Exception e) { + } + } + } + + /** + * 对单个gz压缩包解压 + * @param srcFile 需要解压的gz文件 + * @param destDir 解压后的目标路径 + * @throws Exception + */ + public static void unGzip(String srcFile, String destDir) throws Exception{ + logger.debug("unGzip start……"); + OutputStream out = null; + GZIPInputStream gis = null; + File tempFile = new File(destDir + File.separator + System.currentTimeMillis() + ".tar"); + try { + logger.debug("unGzip tempFile----" + tempFile.getAbsolutePath()); + logger.debug("unGzip srcFile---" + srcFile); + logger.debug("unGzip destDir---" + destDir); + gis = new GZIPInputStream(new FileInputStream(new File(srcFile))); + + if(!tempFile.getParentFile().exists()){ + tempFile.getParentFile().mkdirs(); + } + out = new FileOutputStream(tempFile); + logger.debug("unGzip tempFile---------" + tempFile.getAbsolutePath()); + byte[] buf = new byte[1024 * 2]; + int len = 0; + while ((len = gis.read(buf)) != -1) { + logger.debug("unGzip len---------" + len); + out.write(buf, 0, len); + } + out.flush(); + + //tar包解归档 + GzipUtil.unTar(tempFile.getAbsolutePath(), destDir); + + logger.debug("unGzip end……"); + } catch (Exception e) { + throw e; + } finally { + try { + if(gis!=null) gis.close(); + if(out!=null) out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + logger.debug("tempFile.delete() start……" + tempFile.getAbsolutePath()); + if(tempFile.exists()){ + //tempFile.delete_bak(); + //使用删除文件公共方法 + FileUtil.delDir(tempFile); + logger.debug("unGzip delete file --" + tempFile.getAbsolutePath()); + //FileUtil.checkParentDirExist(tempFile); + } + logger.debug("tempFile.delete() end……" + tempFile.getAbsolutePath()); + } + + } + + /** + * 将单个文件或一个目录压缩成Gzip格式 + * + * @param srcPath 需要压缩的文件目录或文件 + * @param destFile 压缩后的目标文件 + * @throws Exception + */ + public static void gzip(String srcPath, String destFile) throws Exception { + File tempFile = new File(new File(destFile).getParent() + File.separator + System.currentTimeMillis() + ".tar"); + GZIPOutputStream gzout = null; + FileInputStream tarin = null; + try{ + //tar包归档 + GzipUtil.tar(srcPath, tempFile.getAbsolutePath()); + + //建立gzip压缩输出流 + gzout = new GZIPOutputStream(new FileOutputStream(destFile)); + //打开需压缩文件作为文件输入流 + tarin = new FileInputStream(tempFile); + int len; + byte[] buf = new byte[1024 * 2]; + while ((len = tarin.read(buf)) != -1) { + gzout.write(buf, 0, len); + } + gzout.flush(); + + }catch (Exception e) { + throw e; + }finally { + if(tarin!=null) tarin.close(); + if(gzout!=null) gzout.close(); + if(tempFile.exists()){ + //tempFile.delete_bak(); + //使用删除文件公共方法 + FileUtil.delDir(tempFile); + logger.debug("GzipUtil.gzip()--delete tempFile=" + tempFile.getAbsolutePath()); + //FileUtil.checkParentDirExist(tempFile); + } + } + } + + + /** + * 对单个tar压缩包解压,即解归档 + * + * @param srcFile 需要解压的tar文件 + * @param outpath 解压后的目标路径 + * @throws Exception + */ + public static void unTar(String srcFile, String outpath) throws Exception{ + logger.debug("unTar start……"); + TarInputStream tis = null; + try { + logger.debug("unTar srcFile---" + srcFile); + logger.debug("unTar outpath---" + outpath); + File file = new File(srcFile); + if(!file.exists()){ +// throw new Exception("解压源文件不存在: " + file.getAbsolutePath()); + throw new Exception("Unzip source file does not exist: " + file.getAbsolutePath()); + } + tis = new TarInputStream(new FileInputStream(file)); + /*关键在于这个TarEntry 的理解, 实际你的tar包里有多少文件就有多少TarEntry*/ + TarEntry tarEntry = null; + while ((tarEntry = tis.getNextEntry()) != null) { + logger.debug("unTar tarEntry---" + tarEntry); + String tempFileName = (outpath + File.separator + tarEntry.getName()).replaceAll("\\\\", "/"); + logger.debug("unTar tempFileName---" + tempFileName); + if (tarEntry.isDirectory()) { + logger.debug("unTar tarEntry is Dir"); + int end = tempFileName.lastIndexOf("/"); + if (end != -1) { + File dir = new File(tempFileName.substring(0, end)); + if (!dir.exists()) { + dir.mkdirs(); + } + } + } else { + logger.debug("unTar tarEntry is file"); + File tempFile = new File(tempFileName); + if(!tempFile.getParentFile().exists()){ + tempFile.getParentFile().mkdirs(); + } + tempFile.createNewFile(); + OutputStream out = new FileOutputStream(tempFile); + IOUtils.copy(tis, out); + out.close(); + } + } + logger.debug("unTar end……"); + } catch (Exception e) { + throw e; + } finally { + try { + if(tis!=null) tis.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + } + + /** + * 将单个文件或一个目录打成tar包,即归档 + * + * @param srcDir 需要压缩的文件目录或文件 + * @param destFile 压缩后的目标文件 + * @throws Exception + */ + public static void tar(String srcDir, String destFile) throws Exception { + TarOutputStream tout = null; + try{ + //建立tar压缩输出流 + tout = new TarOutputStream(new FileOutputStream(destFile)); + File srcFile = new File(srcDir); + if (!srcFile.exists()) { +// throw new Exception("压缩目录或文件不存在: " + srcFile.getAbsolutePath()); + throw new Exception("Compressed directories or files do not exist: " + srcFile.getAbsolutePath()); + } + if(srcFile.isDirectory()){ + tar(tout,srcFile,srcFile.getName()); + }else{ + tar(tout,srcFile,""); + } + }catch (Exception e) { + throw e; + }finally { + if(tout!=null) tout.close(); + } + } + + /** + * tar压缩 + * @param out: tar压缩流 + * @param srcFile: 需要压缩的目录或文件 + * @param base: 需要压缩的文件在压缩后的tar包内的路径 + * @throws Exception + */ + public static void tar(TarOutputStream tout, File srcFile, String base) throws Exception{ + if (!srcFile.exists()) { +// throw new Exception("压缩目录或文件不存在: " + srcFile.getAbsolutePath()); + throw new Exception("Compressed directories or files do not exist: " + srcFile.getAbsolutePath()); + } + if (srcFile.isDirectory()) { + File[] files = srcFile.listFiles(); + base = base.length() == 0 ? "" : base + "/"; + if (base.length() > 0) { + TarEntry tarEn = new TarEntry(srcFile); //此处必须使用new TarEntry(File file); + tarEn.setName(base); //此处需重置名称,默认是带全路径的,否则打包后会带全路径 + tout.putNextEntry(tarEn); + } + for (int i = 0; i < files.length; i++) { + tar(tout, files[i], base + files[i].getName()); + } + } else { + base = base.length() == 0 ? srcFile.getName() : base; + TarEntry tarEn = new TarEntry(srcFile); + tarEn.setName(base); + tout.putNextEntry(tarEn); + FileInputStream fis = null; + try{ + fis = new FileInputStream(srcFile); + IOUtils.copy(fis, tout); + }catch (IOException e) { + throw e; + }finally{ + if(fis!=null) fis.close(); + } + } + tout.closeEntry(); + } + + + public static void main(String[] args) { + try { + long tt = System.currentTimeMillis(); + //tar("D:\\temp\\test", "d:\\temp\\t1.tar"); + //unTar("D:\\temp\\t1.tar", "D:\temp\\t1"); + + //gzip("D:\\temp\\t1\\gd-2.0.350000", "d:\\temp\\test\\t1.tar.gz"); + unGzip("d:\\temp\\nms.tar.gz", "D:\\temp\\t1"); + System.out.println(System.currentTimeMillis()-tt); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} + |
