• Java 操作SFTP文件工具类 连接获取服务器Excel文件并操作


    原文连接:https://blog.csdn.net/qq_21339919/article/details/121038463
    Java 操作SFTP文件工具栏

    1、数据库连接相关需要自己定义
    import com.kingdee.bos.BOSException;
    import com.kingdee.bos.Context;
    import com.kingdee.eas.util.app.DbUtil;
    import com.kingdee.jdbc.rowset.IRowSet;
    2、需要pom.xml文件中引入包

    <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>	
    
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
    

    package com.leyou.common.utils;

    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;

    import org.apache.commons.io.IOUtils;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Vector;

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.Field;

    import org.apache.poi.ss.usermodel.Workbook;

    import com.kingdee.bos.BOSException;
    import com.kingdee.bos.Context;

    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpATTRS;
    import com.jcraft.jsch.SftpException;
    import com.jcraft.jsch.ChannelSftp.LsEntry;
    import com.kingdee.eas.util.app.DbUtil;
    import com.kingdee.jdbc.rowset.IRowSet;

    /**

    • sftp工具类

    • @author xxx

    • @date 2020-12-17

    • @time 下午3:57:44

    • @version 1.0
      */
      public class SFTPUtils {

      private String host = ""; // 服务器连接ip
      private String username = ""; // 用户名
      private String password = ""; // 密码
      private int port = 22; // 端口号

      public SFTPUtils() {
      }

      public SFTPUtils(String host, int port, String username, String password) {
      this.host = host;
      this.username = username;
      this.password = password;
      this.port = port;
      }

      public SFTPUtils(String host, String username, String password) {
      this.host = host;
      this.username = username;
      this.password = password;
      }

      /**

      • 连接sshSession
        */
        public Session sshSession() {
        Session sshSession = null;
        JSch jsch = new JSch();
        while (true) {
        try {
        jsch.getSession(username, host, port);
        sshSession = jsch.getSession(username, host, port);
        sshSession.setPassword(password);
        // Properties sshConfig = new Properties();
        // sshConfig.put("StrictHostKeyChecking", "no");
        // sshSession.setConfig("kex", "diffie-hellman-group1-sha1");
        sshSession.setConfig("StrictHostKeyChecking", "no");
        // sshSession.setConfig("StrictHostKeyChecking", "no");
        // sshSession.setConfig(sshConfig);
        sshSession.connect();
        return sshSession;
        } catch (Exception e) {
        // TODO Auto-generated catch block
        try {
        Thread.sleep(5000);
        } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        e.printStackTrace();

         }
        

        }
        }

      /**

      • sshSession通过sshSession连接ChannelSftp(SFTP)
        */
        public ChannelSftp connect(Session sshSession) {
        ChannelSftp sftp = null;
        Channel channel = null;
        while (true) {
        try {
        channel = sshSession.openChannel("sftp");
        channel.connect();
        sftp = (ChannelSftp) channel;
        Class cl = ChannelSftp.class;
        Field f1 =cl.getDeclaredField("server_version");
        f1.setAccessible(true);
        f1.set(sftp, 2);
        sftp.setFilenameEncoding("gbk");
        return sftp;
        } catch (JSchException e) {
        try {
        Thread.sleep(5000);
        } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        sshSession = sshSession();
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (SftpException e) {
        // TODO Auto-generated catch block
        try {
        Thread.sleep(5000);
        } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        e.printStackTrace();
        } catch (SecurityException e) {
        try {
        Thread.sleep(5000);
        } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (NoSuchFieldException e) {
        try {
        Thread.sleep(5000);
        } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (IllegalArgumentException e) {
        try {
        Thread.sleep(5000);
        } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (IllegalAccessException e) {
        try {
        Thread.sleep(5000);
        } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        }
        }

      /**

      • 关闭ChannelSftp,Session连接
        */
        public void disconnect(ChannelSftp sftp, Session sshSession) {
        if (sftp != null) {
        if (sftp.isConnected()) {
        sftp.disconnect();
        }
        }
        if (sshSession != null) {
        if (sshSession.isConnected()) {
        sshSession.disconnect();
        }
        }
        }

      /**

      • 批量获取XML文件流

      • @param remotPath

      •        :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
        
      • @param indexOfFileName

      •        :获取某一天的文件(yyyyMMdd)
        
      • @param indexOfFileNameXiaJi

      •        :获取某一天的文件下级文件夹res或者req或者什么文件夹名
        
      • @param ctx

      • @param yinhang

      •        :银行简称以_符号结束(BOC_)
        
      • @param sftp

      • @param sshSession

      • @return filenames :文件名称以及文件流 (Map<String, InputStream>)
        */
        public Map<String, InputStream> batchDownLoadFileXml(String remotePath,
        String indexOfFileName, String indexOfFileNameXiaJi,
        String yinhang, Context ctx, ChannelSftp sftp, Session sshSession) {
        Map<String, InputStream> filenames = new HashMap<String, InputStream>();
        ;
        Vector v = listFiles(remotePath, sftp);
        // sftp.cd(remotePath);
        if (v.size() > 0) {
        System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size());
        Iterator it = v.iterator();
        while (it.hasNext()) {
        LsEntry entry = (LsEntry) it.next();
        String filename = entry.getFilename();
        SftpATTRS attrs = entry.getAttrs();
        if (!attrs.isDir()) {
        // boolean flag = false;

                 int lastIndexOf = 0;
                 if (filename.indexOf(indexOfFileName) != -1) {
                     // String localFileName = + filename;
                     remoteZipToFile(remotePath + filename, remotePath,
                             sshSession);
                     lastIndexOf = filename.lastIndexOf(".");
                     Vector v1 = listFiles(remotePath + indexOfFileName
                             + "/" + indexOfFileNameXiaJi, sftp);
                     // sftp.cd(remotePath);
        
                     if (v1.size() > 0) {
        
                         Iterator it1 = v1.iterator();
                         List<String> allList = new ArrayList<String>();
                         List<String> dbList = dbList(remotePath,
                                 indexOfFileName, indexOfFileNameXiaJi,
                                 yinhang, "HIS\\|CUR\\", ctx, sshSession);
                         List<String> chaZhiList = null;
                         if (dbList != null) {
                             remoteZipToFileHouZhui(remotePath, indexOfFileName,
                                     indexOfFileNameXiaJi, "BAL", sshSession);
                             System.out.println("本次读取文件个数不为零,读取...fileSize="
                                     + v1.size());
                             while (it1.hasNext()) {
                                 LsEntry entry1 = (LsEntry) it1.next();
                                 String filename1 = entry1.getFilename();
                                 SftpATTRS attrs1 = entry1.getAttrs();
                                 if (!attrs1.isDir()) {
                                     int lastIndexOf1 = filename1
                                             .lastIndexOf(".");
                                     String suffix = filename1
                                             .substring(lastIndexOf1);
                                     if (suffix.toUpperCase().equals(".CUR")
                                             || suffix.toUpperCase().equals(
                                             ".HIS")) {
                                         allList.add(filename1);
        
                                     }
                                 }
                             }
                         }
                         if ("res".equals(indexOfFileNameXiaJi)) {
                             chaZhiList = getNeedAddOpenList(allList, dbList);
                         } else {
                             chaZhiList = allList;
                         }
                         InputStream is = null;
                         String filename1 = null;
                         for (int i = 0; i < chaZhiList.size(); i++) {
                             filename1 = chaZhiList.get(i);
                             while (true) {
                                 try {
                                     is = sftp.get(remotePath
                                             + filename.substring(0,
                                             lastIndexOf) + "/"
                                             + indexOfFileNameXiaJi + "/"
                                             + filename1);
                                     break;
                                 } catch (SftpException e) {
                                     // TODO Auto-generated catch block
                                     try {
                                         Thread.sleep(5000);
                                         sftp = connect(sshSession());
                                     } catch (Exception e1) {
                                         // TODO Auto-generated catch block
                                         e1.printStackTrace();
                                     }
                                     e.printStackTrace();
                                 }
                             }
                             // TODO 编码定义
                             BufferedReader bre;
                             try {
                                 bre = new BufferedReader(
                                         new InputStreamReader(is, "GBK"));
        
                                 StringBuffer a = new StringBuffer();
                                 String str = "";
                                 // 循环读取,一次读取一行
                                 while ((str = bre.readLine()) != null) {
                                     a.append(str);
                                 }
        
                                 if (a.indexOf("<?xml") < 0) {
                                     a
                                             .insert(0,
                                                     "<?xml version=\"1.0\" encoding=\"GBK\"?>");
                                 }
                                 String a1 = a.toString().replace("UTF-8",
                                         "GBK");
                                 a1 = a.toString().replace("utf-8", "GBK");
                                 is = new ByteArrayInputStream(a1.getBytes());
                                 filenames.put(filename1, is);
                             } catch (UnsupportedEncodingException e1) {
                                 // TODO Auto-generated catch block
                                 e1.printStackTrace();
                             } catch (IOException e) {
                                 // TODO Auto-generated catch block
                                 e.printStackTrace();
                             }
                             try {
                                 is.close();
        
                             } catch (IOException e) {
                                 // TODO Auto-generated catch
                                 // block
                                 e.printStackTrace();
                             }
                         }
                     }
                     rm(remotePath + filename.substring(0, lastIndexOf),
                             sshSession);
                     break;
                 }
        
             }
        
         }
        

        }
        return filenames;
        }

      /**

      • 判断list差值 :

      • @return filenames :文件名称以及文件流 (Map<String, InputStream>)
        */
        public List getNeedAddOpenList(List allList,
        List dbList) {
        if (dbList != null && !dbList.isEmpty()) {
        Map<String, String> dataMap = new HashMap<String, String>();
        for (String filename : dbList) {
        dataMap.put(filename, filename);

         }
         List<String> newList = new ArrayList<String>();
         for (String filename : allList) {
             if (!dataMap.containsKey(filename)) {
                 newList.add(filename);
             }
         }
         return newList;
        

        } else {
        return allList;

        }

      }

      /**

      • 判断list差值
      • @param remotPath
      •        :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
        
      • @param indexOfFileName
      •        :某一天的文件夹(yyyyMMdd)
        
      • @param indexOfFileNameXiaJi
      •        :某一天的文件夹下级文件夹res或者req或者什么文件夹名
        
      • @param houZhuiMing
      •        :文件后缀名HIS\|CUR\
        
      • @param sshSession
      •        : :文件名称以及文件流 (Map<String, InputStream>)
        

      /
      public List dbList(String remotePath, String indexOfFileName,
      String indexOfFileNameXiaJi, String yinHang, String houZhuiMing,
      Context ctx, Session sshSession) {
      int i = 4;
      int dbSum = 0;
      String tiaojian2 = "SUBSTR(cfyinhangfilename,2" + i + ",8)";
      if ("CMBC_".equals(yinHang)) {
      i = 5;
      tiaojian2 = "SUBSTR(cfyinhangfilename,2" + (i + 1) + ",8)";
      } else if ("CIB_".equals(yinHang)) {
      tiaojian2 = "SUBSTR(cfyinhangfilename,2" + (i + 1) + ",8)";
      }
      List dbList = null;
      try {
      IRowSet irfileName = DbUtil.executeQuery(ctx,
      "/
      dialect/ SELECT count() FROM CT_JIA_XMLFILENAME where SUBSTR(cfyinhangfilename,0,"
      + i + ") = '" + yinHang + "' and " + tiaojian2
      + " ='" + indexOfFileName + "' and CFzhuangtai = 1 ");
      while (irfileName.next()) {
      dbSum = irfileName.getInt(1);
      }
      if (dbSum != getHouZhuiMingFileSum(remotePath, indexOfFileName,
      indexOfFileNameXiaJi, houZhuiMing, sshSession)) {
      dbList = new ArrayList();
      irfileName = DbUtil
      .executeQuery(
      ctx,
      " /dialect/ SELECT SUBSTR(cfyinhangfilename,"+(i+ 1)+ ",100) FROM CT_JIA_XMLFILENAME where SUBSTR(cfyinhangfilename,0,"
      + i + ") = '" + yinHang + "' and "
      + tiaojian2 + " ='" + indexOfFileName
      + "' and CFzhuangtai = 1");
      while (irfileName.next()) {
      dbList.add(irfileName.getString(1));
      }
      String logsql =" /dialect/ delete FROM CT_JIA_XMLLOG where cfyinhangfilename in (SELECT cfyinhangfilename FROM CT_JIA_XMLFILENAME " +
      "where SUBSTR(cfyinhangfilename,0,"
      + i + ") = '" + yinHang + "' and "
      + tiaojian2 + " ='" + indexOfFileName
      + "' and CFzhuangtai <>1 )" ;
      DbUtil.execute(
      ctx,
      logsql);

               try {
                   Thread.sleep(5000);
               } catch (InterruptedException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
      
      
      
               String filenamesql = " /*dialect*/ delete FROM CT_JIA_XMLFILENAME  where   SUBSTR(cfyinhangfilename,0,"
                       + i + ") = '" + yinHang + "'  and "
                       + tiaojian2 + " ='" + indexOfFileName
                       + "' and CFzhuangtai <>1 ";
               DbUtil.execute(
                       ctx,
                       filenamesql);
               return dbList;
           }else{
               return null;
      
           }
       } catch (BOSException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       return dbList;
      

      }

      /**

      • 批量获取EXCEL文件流

      • @param remotPath

      •        :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
        
      • @param indexOfFileName

      •        :获取某一天的文件(yyyyMMdd)
        
      • @param indexOfFileNameXiaJi

      •        :获取某一天的文件下级文件夹res或者req或者什么文件夹名
        
      • @param ctx

      • @param yinhang

      •        :银行简称以_符号结束(BOC_)
        
      • @param sftp

      • @param sshSession

      • @return filenames :文件名称以及文件流 (Map<String, InputStream>)
        */
        public Map<String, Workbook> batchDownLoadFileexcel(String remotePath,
        String indexOfFileName, String indexOfFileNameXiaJi,
        ChannelSftp sftp, Session sshSession) {
        Map<String, Workbook> filenames = new HashMap<String, Workbook>();

        Vector v1 = listFiles(remotePath + "/" + indexOfFileName + "/"
        + indexOfFileNameXiaJi + "/", sftp);
        // remotePath +"/"+ indexOfFileName
        // + "/交易记录表");
        // /data/msxg
        // sftp.cd(remotePath);
        if (v1.size() > 0) {
        System.out.println("本次读取excel文件个数不为零,读取...fileSize=" + v1.size());
        Iterator it1 = v1.iterator();
        while (it1.hasNext()) {
        LsEntry entry1 = (LsEntry) it1.next();
        String filename1 = entry1.getFilename();
        SftpATTRS attrs1 = entry1.getAttrs();
        if (!attrs1.isDir()) {
        int lastIndexOf1 = filename1.lastIndexOf(".");
        String suffix = filename1.substring(lastIndexOf1);
        if (suffix.toUpperCase().equals(".XLSX")
        || suffix.toUpperCase().equals(".XLS")) {
        // remotePath+filename.substring(0,
        // lastIndexOf)+filename1;
        InputStream is = null;
        while (true) {
        try {
        is = sftp.get(// "/data/msxg/"+filename1);
        remotePath + "/" + indexOfFileName
        + "/" + indexOfFileNameXiaJi
        + "/" + filename1);
        break;
        } catch (SftpException e) {
        // TODO Auto-generated catch block
        try {
        Thread.sleep(5000);
        sftp = connect(sshSession());
        } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        e.printStackTrace();
        }
        }
        Workbook wb1 = null;
        try {
        wb1 = ExcelUtil.readExcel(filename1, is);
        } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        filenames.put(filename1, wb1);

                     try {
                         is.close();
        
                     } catch (IOException e) {
                         // TODO Auto-generated catch
                         // block
                         e.printStackTrace();
                     }
                 }
        
             }
         }
        

        }
        return filenames;
        }

      /**

      • 批量下载文件

      • @param remotPath

      •        :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
        
      • @param localPath

      •        :本地保存目录(以路径符号结束,D:\Duansha\sftp\)
        
      • @param del

      •        :下载后是否删除sftp文件
        
      • @return
        */
        public List batchDownLoadFile(String remotePath, String localPath,
        boolean del, ChannelSftp sftp) {
        List filenames = new ArrayList();
        // connect();
        Vector v = listFiles(remotePath, sftp);
        // sftp.cd(remotePath);
        if (v.size() > 0) {
        System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size());
        Iterator it = v.iterator();
        while (it.hasNext()) {
        LsEntry entry = (LsEntry) it.next();
        String filename = entry.getFilename();
        SftpATTRS attrs = entry.getAttrs();
        if (!attrs.isDir()) {
        boolean flag = false;
        String localFileName = localPath + filename;
        // 三种情况
        flag = downloadFile(remotePath, filename, localPath,
        filename, sftp);
        if (flag) {
        filenames.add(localFileName);
        if (flag && del) {
        deleteSFTP(remotePath, filename, sftp);
        }

                 }
             }
         }
        

        }

        return filenames;
        }

      /*

      • 远程下载目录(以路径符号结束)
      • @param remoteFileName :下载文件名
      • @param localPath :本地保存目录(以路径符号结束)
      • @param localFileName :保存文件名
      • @return
        */
        public boolean downloadFile(String remotePath, String remoteFileName,
        String localPath, String localFileName, ChannelSftp sftp) {
        FileOutputStream fieloutput = null;
        try {
        // sftp.cd(remotePath);
        File file = new File(localPath + "/" + localFileName);
        if (!file.isDirectory()) {
        mkdirs(localPath + localFileName);
        }
        fieloutput = new FileOutputStream(file);
        sftp.get(remotePath + remoteFileName, fieloutput);
        return true;
        } catch (FileNotFoundException e) {
        e.printStackTrace();
        } catch (SftpException e) {
        e.printStackTrace();
        } finally {
        if (null != fieloutput) {
        try {
        fieloutput.close();
        } catch (IOException e) {
        e.printStackTrace();
        }
        }
        }
        return false;
        }

      /**

      • 上传单个文件
      • @param remotePath
      •        :远程保存目录
        
      • @param remoteFileName
      •        :保存文件名
        
      • @param localPath
      •        :本地上传目录(以路径符号结束)
        
      • @param localFileName
      •        :上传的文件名
        
      • @return
        */
        public boolean uploadFile(String remotePath, String remoteFileName,
        String localPath, String localFileName, ChannelSftp sftp,
        Session sshSession) {
        FileInputStream in = null;
        try {
        createDir(remotePath, sftp, sshSession);
        File file = new File(localPath + localFileName);
        in = new FileInputStream(file);
        sftp.put(in, remoteFileName);
        return true;
        } catch (FileNotFoundException e) {
        e.printStackTrace();
        } catch (SftpException e) {
        e.printStackTrace();
        } finally {
        if (in != null) {
        try {
        in.close();
        } catch (IOException e) {
        e.printStackTrace();
        }
        }
        }
        return false;
        }

      /**

      • 批量上传文件
      • @param remotePath
      •        :远程保存目录
        
      • @param localPath
      •        :本地上传目录(以路径符号结束)
        
      • @param del
      •        :上传后是否删除本地文件
        
      • @return
        */
        public boolean bacthUploadFile(String remotePath, String localPath,
        boolean del, ChannelSftp sftp, Session sshSession) {
        try {
        connect(sshSession);
        File file = new File(localPath);
        File[] files = file.listFiles();
        for (int i = 0; i < files.length; i++) {
        if (files[i].isFile()
        && files[i].getName().indexOf("bak") == -1) {
        if (this.uploadFile(remotePath, files[i].getName(),
        localPath, files[i].getName(), sftp, sshSession)
        && del) {
        deleteFile(localPath + files[i].getName());
        }
        }
        }
        return true;
        } catch (Exception e) {
        e.printStackTrace();
        }
        return false;

      }

      /**

      • 删除本地文件

      • @param filePath

      • @return
        */
        public boolean deleteFile(String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
        return false;
        }

        if (!file.isFile()) {
        return false;
        }
        boolean rs = file.delete();
        return rs;
        }

      /**

      • 创建目录

      • @param createpath

      • @return
        */
        public boolean createDir(String createpath, ChannelSftp sftp,
        Session sshSession) {
        try {
        if (isDirExist(createpath, sftp)) {
        sftp.cd(createpath);
        return true;
        }
        String pathArry[] = createpath.split("/");
        StringBuffer filePath = new StringBuffer("/");
        for (String path : pathArry) {
        if (path.equals("")) {
        continue;
        }
        filePath.append(path + "/");
        if (isDirExist(filePath.toString(), sftp)) {
        sftp.cd(filePath.toString());
        } else {
        // 建立目录
        sftp.mkdir(filePath.toString());
        // 进入并设置为当前目录
        sftp.cd(filePath.toString());
        }

         }
         sftp.cd(createpath);
         return true;
        

        } catch (SftpException e) {
        e.printStackTrace();
        }
        return false;
        }

      /**

      • 判断目录是否存在

      • @param directory

      • @return
        */
        public boolean isDirExist(String directory, ChannelSftp sftp) {
        boolean isDirExistFlag = false;
        while (true) {
        try {

             SftpATTRS sftpATTRS = sftp.lstat(directory);
             isDirExistFlag = true;
             return sftpATTRS.isDir();
        
         } catch (Exception e) {
             if (e.getMessage().toLowerCase().equals("no such file")||e.getMessage().toLowerCase().equals("failure")) {
                 return isDirExistFlag = false;
             } else {
                 try {
                     e.printStackTrace();
                     Thread.sleep(5000);
                     sftp = connect(sshSession());
                 } catch (Exception e1) {
                     // TODO Auto-generated catch block
                     e1.printStackTrace();
                 }
             }
         }
        

        }

      }

      /**

      • 删除stfp文件
      • @param directory
      •        :要删除文件所在目录
        
      • @param deleteFile
      •        :要删除的文件
        
      • @param sftp
        */
        public void deleteSFTP(String directory, String deleteFile, ChannelSftp sftp) {
        try {
        // sftp.cd(directory);
        sftp.rm(directory + deleteFile);
        } catch (Exception e) {
        e.printStackTrace();
        }
        }

      /**

      • 如果目录不存在就创建目录

      • @param path
        */
        public void mkdirs(String path) {
        File f = new File(path);

        String fs = f.getParent();

        f = new File(fs);

        if (!f.exists()) {
        f.mkdirs();
        }
        }

      // 需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
      public static void deleteFolder(File folder) throws Exception {
      if (!folder.exists()) {
      throw new Exception("文件不存在");
      }
      File[] files = folder.listFiles();
      if (files != null) {
      for (File file : files) {
      if (file.isDirectory()) {
      // 递归直到目录下没有文件
      deleteFolder(file);
      } else {
      // 删除
      file.delete();
      }
      }
      }
      // 删除
      folder.delete();

      }

      /**

      • 列出目录下的文件

      • @param directory

      •        :要列出的目录
        
      • @param sftp

      • @return

      • @throws SftpException
        */
        public Vector listFiles(String directory, ChannelSftp sftp) {
        Vector v = new Vector();

        while (true) {
        try {
        if (isDirExist(directory, sftp)) {
        v = sftp.ls(directory);
        }
        return v;
        } catch (SftpException e) {
        // TODO Auto-generated catch block
        try {
        Thread.sleep(5000);
        sftp = connect(sshSession());
        } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
        }
        e.printStackTrace();
        }

        }
        }

      public String getHost() {
      return host;
      }

      public void setHost(String host) {
      this.host = host;
      }

      public String getUsername() {
      return username;
      }

      public void setUsername(String username) {
      this.username = username;
      }

      public String getPassword() {
      return password;
      }

      public void setPassword(String password) {
      this.password = password;
      }

      public int getPort() {
      return port;
      }

      public void setPort(int port) {
      this.port = port;
      }

      /**

      • @Description:远程解压缩指定目录下的指定名字的文件
      • @param fileName
      •        :需要解压的文件名字
        
      • @param decpath
      •        :解压完成后的存放路径
        

      */
      public void remoteZipToFile(String fileName, String decpath,
      Session sshSession) {
      System.out.println("开始解压");
      runCmd("/data/rizhi/unzip-5.52/unzip -o " + fileName + " -d /"
      + decpath + "/", sshSession);
      System.out.println("解压成功");

      }

      /**

      • @Description:远程删除目录
      • @param decpath
      •        :删除目录及以下文件
        

      */
      public void rm(String decpath, Session sshSession) {
      System.out.println("开始删除" + decpath);
      // out.println("rm -rf " + decpath);// 解压zip格式
      runCmd("rm -rf " + decpath, sshSession);
      System.out.println("删除" + decpath + "成功");
      }

      /**

      • 远程删除目录下后缀名为某个的文件
      • @param remotPath
      •        :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
        
      • @param indexOfFileName
      •        :某一天的文件夹(yyyyMMdd)
        
      • @param indexOfFileNameXiaJi
      •        :某一天的文件夹下级文件夹res或者req或者什么文件夹名
        
      • @param houZhuiMing
      •        :文件后缀名(BAL)
        
      • @param sshSession
      • @return filenames :文件名称以及文件流 (Map<String, InputStream>)
        /
        public void remoteZipToFileHouZhui(String remotePath,
        String indexOfFileName, String indexOfFileNameXiaJi,
        String houZhuiMing, Session sshSession) {
        System.out.println("开始删除" + remotePath + indexOfFileName + "/"
        + indexOfFileNameXiaJi + " 目录下" + houZhuiMing + "文件 ");
        runCmd("find " + remotePath + indexOfFileName + "/"
        + indexOfFileNameXiaJi + " -name "
        ." + houZhuiMing
        + "" | xargs rm", sshSession);
        System.out.println("结束删除" + remotePath + indexOfFileName + "/"
        + indexOfFileNameXiaJi + " 目录下" + houZhuiMing + "文件,删除成功 ");
        }

      /**

      • 远程获取目录下后缀名为某几类类型的文件
      • @param remotPath
      •        :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
        
      • @param indexOfFileName
      •        :某一天的文件夹(yyyyMMdd)
        
      • @param indexOfFileNameXiaJi
      •        :某一天的文件夹下级文件夹res或者req或者什么文件夹名
        
      • @param houZhuiMing
      •        :文件后缀名HIS\|CUR\
        
      • @param sshSession
      • @return fileSize :文件个数
        /
        public Integer getHouZhuiMingFileSum(String remotePath,
        String indexOfFileName, String indexOfFileNameXiaJi,
        String houZhuiMing, Session sshSession) {
        System.out.println("开始获取" + remotePath + indexOfFileName + "/"
        + indexOfFileNameXiaJi + " 目录下CUR,HIS文件个数 ");
        String fileSize = runCmd("find " + remotePath + indexOfFileName + "/"
        + indexOfFileNameXiaJi + " -type f -regex ".
        \.\("
        + houZhuiMing + ")"| wc -l", sshSession);
        System.out.println("结束获取" + remotePath + indexOfFileName + "/"
        + indexOfFileNameXiaJi + " 目录下CUR,HIS文件,个数为: " + fileSize);
        return Integer.parseInt(fileSize.trim());

      }

      /**

      • 执行linux代码; :

      • @return filenames :文件名称以及文件流 (Map<String, InputStream>)
        */
        public String runCmd(String cmd, Session sshSession) {
        ChannelExec channelExec = null;
        InputStream in = null;
        while (true) {
        try {

             channelExec = (ChannelExec) sshSession.openChannel("exec");
             in = channelExec.getInputStream();
             channelExec.setCommand(cmd);
             channelExec.connect();
             String s = IOUtils.toString(in, "UTF-8");
             System.out.println("结果:" + s);
             channelExec.disconnect();
             return s;
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
             return null;
         } catch (JSchException e) {
             sshSession = sshSession();
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
        

        }
        }

      /**

      • 获取文件大小 :
      • @return filenames :文件名称以及文件流 (Map<String, InputStream>)
        */
        public long getFileSize(String srcSftpFilePath, ChannelSftp sftp) {
        while (true) {
        try {
        SftpATTRS sftpATTRS = sftp.lstat(srcSftpFilePath);
        long filesize = sftpATTRS.getSize();
        return filesize;
        } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        sftp = connect(sshSession());
        }
        }
        }

    }

  • 相关阅读:
    CF1172F
    CF506E
    【清华集训2014】玛里苟斯
    CF516E Drazil and His Happy Friends
    [NOI2017]游戏(2-SAT)
    [bzoj2878][Noi2012]迷失游乐园(基环树dp)
    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
    [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
    [AT2306]Rearranging(拓扑序)
    [bzoj5301][Cqoi2018]异或序列
  • 原文地址:https://www.cnblogs.com/sunny3158/p/16557421.html
Copyright © 2020-2023  润新知