文件压缩跟解压(本地&Linux服务器)

远程解压需要的jar包:

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.1</version>
</dependency>
<dependency>
    <groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>build210</version>
</dependency>

 

Java实现文件压缩跟解压:

package com.sunsheen.jfids.studio.monitor.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import org.eclipse.core.runtime.Assert;

import ch.ethz.ssh2.ChannelCondition;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

import com.sunsheen.jfids.studio.monitor.HKMoniter;
import com.sunsheen.jfids.studio.monitor.HKMoniterFactory;
import com.sunsheen.jfids.studio.monitor.common.LogInfo;
/**
 * 多文件的打包压缩跟解压
 * @author WangSong
 *
 */
public class ZipFiles {
    private static HKMoniter moniter = HKMoniterFactory.getLogger(ZipFiles.class.getName());

     /**
       * 功能:压缩多个文件成一个zip文件(本地)
       * @param srcfile:源文件列表
       * @param zipfile:压缩后的文件
       */
      public static void zipFiles(File[] srcfile,File zipfile){
          if(srcfile.length == 0 || null==srcfile)
              return;
          
          byte[] buf=new byte[1024];
          try {
              //ZipOutputStream :完成文件或文件夹的压缩
              ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
              for(int i=0;i<srcfile.length;i++){
                  FileInputStream in = new FileInputStream(srcfile[i]);//读取文件
                  out.putNextEntry(new ZipEntry(srcfile[i].getName()));//设置内文件名
                  //写入数据
                  int length;
                  while((length = in.read(buf)) > 0){
                          out.write(buf,0,length);
                  }
                  out.closeEntry();
                  in.close();
                  }
                  out.close();
                moniter.info("文件【"+zipfile.getName()+"】,压缩完成!");
                  System.out.println("压缩完成.");
            } catch (Exception e) {
                e.printStackTrace();
            }
          }
      
      /**
       * 功能:解压缩(本地)
       * @param zipfile:需要解压缩的文件
       * @param descDir:解压后的目标目录
       */
      public static void unZipFiles(File zipfile,String descDir){
     
          try {
              ZipFile zf = new ZipFile(zipfile);//格式化
              //循环遍历出压缩的每个文件
              for(Enumeration entries = zf.entries();entries.hasMoreElements();){
                  ZipEntry entry = (ZipEntry) entries.nextElement();
                  String zipEntryName = entry.getName();//当前压缩文件中文件名
                  InputStream in = zf.getInputStream(entry);
                  
                  File mkFile = new File(descDir + zipEntryName);
                  mkFile.createNewFile();
                  
                  OutputStream out=new FileOutputStream(descDir + zipEntryName);
                  byte[] buf1 = new byte[1024];
                  int len;
                  while((len=in.read(buf1)) > 0){
                      out.write(buf1,0,len);
                  }
                  in.close();
                  out.close();
                  moniter.info("文件【"+zipfile.getName()+"】,解压缩完成!");
                  System.out.println("解压缩完成.");
              }
            } catch (Exception e) {
                e.printStackTrace();
            }
      }
      
      /**
       * 壓縮指定文件夾下所有文件
       * @param targetZipFile    压缩后的文件     eg:d://logs//log.zip
       * @param logParentFolder    日志文件所在的文件夹    eg:e://logs
       * @return
       */
      public static File zipLogs(String targetZipFile,String logParentFolder){
        //定义日志压缩文件
        File[] logsFileArr = new File(logParentFolder).listFiles();//所有的日志文件
        //創建一個空的目標zip文件
        File resultZip = new File(targetZipFile);
        //壓縮
        zipFiles(logsFileArr, resultZip);
        return resultZip;
      }
      
      
      /**
       * 解压文件(远程)
       * @param romoteAddr    服务器地址
       * @param username    服务器用户名
       * @param password    服务器密码
       * @param targetFolder    服务器上需要解压文件的目录    eg:/usr/local/hk-logs
       * @param zipFileName    需要解压文件的文件名    eg:logs.zip
       */
      public static void remoteUnZip(String romoteAddr,String username,String password,
              String targetFolder,String zipFileName){
          
          try {
              Connection connection = new Connection(romoteAddr);// 创建一个连接实例
              connection.connect();// Now connect
              boolean isAuthenticated = connection.authenticateWithPassword(username, password);//認證
              Assert.isTrue(isAuthenticated, "用戶名或者密碼錯誤!");
              Session sess = connection.openSession();// 創建一個會話
              sess.requestPTY("bash");
              sess.startShell();
              InputStream stdout = new StreamGobbler(sess.getStdout());
              InputStream stderr = new StreamGobbler(sess.getStderr());
              BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(stdout));
              BufferedReader stderrReader = new BufferedReader(new InputStreamReader(stderr));
              //向服务器上输入命令
              PrintWriter out = new PrintWriter(sess.getStdin());
              out.println("cd " + targetFolder);//進入日志文件存放的目录
              out.println("ll");
              out.println("unzip -o -d "+targetFolder+" "+zipFileName);//解压文件到指定位置
              out.println("ll");
              out.println("exit");
              out.close();
              sess.waitForCondition(ChannelCondition.CLOSED|ChannelCondition.EOF | ChannelCondition.EXIT_STATUS,30000);
              
              //本机查看远程操作的指令及状态
              showRemoteShell(stdoutReader,stderrReader,sess);
              
              //关闭连接
              sess.close();
              connection.close();
          } catch (IOException e) {
              moniter.error("远程解压文件【"+ zipFileName +"】,错误:" + e);
              e.printStackTrace(System.err);
              System.exit(2);
          }
      }
      
      //打印远程指令及状态
      private static void showRemoteShell(BufferedReader stdoutReader,BufferedReader stderrReader,
              Session sess) throws IOException{
          System.out.println("输入在服务器的指令:");
          while (true) {
              String line = stdoutReader.readLine();
              if (line == null)
                  break;
              System.out.println(line);
          }
          System.out.println("输入指令后对应的显示信息:");
          while (true) {
              String line = stderrReader.readLine();
              if (line == null)
                  break;
              System.out.println(line);
          }
          System.out.println("ExitCode: " + sess.getExitStatus());
      }
      
}
View Code

 

posted @ 2019-10-10 11:20  SoyWang  阅读(353)  评论(0编辑  收藏  举报