• 服务器文件操作 ChannelSftp 的用法


    1.常用方法

    put(): 文件上传
    get(): 文件下载
    cd(): 进入指定目录
    ls(): 得到指定目录下的文件列表
    rm(): 删除指定文件

    2.java案例

    package com.test01;

    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;
    import java.io.*;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.file.attribute.BasicFileAttributes;
    import java.nio.file.attribute.FileTime;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Vector;

    /**

    • 〈一句话功能简述〉

    • 〈〉

    • @author Min.Z

    • @create 2021/4/21

    • @since 1.0.0
      */
      public class testend {
      private static final int connectTimeout = 30000;

      public static void main(String[] args) {
      //文件名
      String fileName = “zhoumin.txt”;
      //服务器文件路径
      String path = “/min/ap/ecsp/”;
      //服务器ip
      String host = “192.168.43.218”;
      //服务器端口号
      int port = 22;
      //服务器登录用户名
      String user = “min”;
      //服务器用户密码
      String password = “123”;
      //要保存的文件:路径+名字
      String saveLocalFile = “D:\abc.txt”;
      //要生成本地的文件:路径+名字
      String createLocalFile = “D:\zhou123.txt”;
      //要删除本地的文件的路径
      String localPath = “D:\Temp\”;

       /**
        * 读取文件内容返回byte数组
        */
       byte[] array = download(fileName, path, host, port, user, password);
           try {
           //将文件的byte的数组转为String类型,
           System.out.println(new String(array, "utf-8"));
       } catch (Exception e) {
           throw new RuntimeException(e);
       }
      
      
       /**
        * 下载文件到本地
        */
       boolean fileExist = downloadLocal(saveLocalFile, fileName, path, host, port, user, password);
       System.out.println("文件是否存在=="+fileExist);
       //读取下载后的本地文件
       if (fileExist) {
           readLocalFile(saveLocalFile);
       }
      
      
       //创建并写入本地文件
       File file = writeLocalFile(createLocalFile);
       /**
        * 上传文件到服务器
        */
       uploadLocalFile(file, path, host, port, user, password);
      
      
       /**
        * 根据文件创建时间删除文件
        */
       try {
           Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-04-21 16:20:00");
           //删除本地文件
           deleteLocalFile(localPath, date);
           removeDateFile(date, path, host, port, user, password);
       } catch (ParseException e) {
           e.printStackTrace();
       }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42

      }

      public static boolean stringIsNotEmpty(String str) {
      return null != str && str.length() != 0;
      }

      /**

      • @return 读取文件内容返回byte数组
        */
        public static byte[] download(String fileName, String path, String host, int port, String user, String password) {
        Session session = null;
        ChannelSftp channel = null;//ChannelSftp类是JSch实现SFTP核心类
        try {
        JSch jsch = new JSch();
        if (port == 0) {
        session = jsch.getSession(user, host);
        } else {
        session = jsch.getSession(user, host, port);
        }
        session.setPassword(password);
        //禁用StrictHostKeyChecking选项会使连接的安全性低于启用该选项的安全性,
        // 因为它可以让您连接到远程服务器而无需验证其SSH主机密钥.如果启用该选项,
        // 则只能连接到SSH客户端已知密钥的服务器
        session.setConfig(“StrictHostKeyChecking”, “no”);
        session.connect(connectTimeout);
        channel = (ChannelSftp) session.openChannel(“sftp”);
        channel.connect(connectTimeout);

         if (!(path == null || path.trim().length() == 0)) {
             channel.cd(path);//进入指定目录
         }
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         channel.get(fileName, outputStream);//文件下载,文件不存在报错 2: No such file
         byte[] arrayOfByte = outputStream.toByteArray();
         return arrayOfByte;
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7

        } catch (SftpException e) {
        if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {//2: No such file
        // file doesn’t exist
        throw new RuntimeException(fileName+“文件不存在”);
        } else {
        throw new RuntimeException(e);//这个一定要捕捉异常,不然代码报错,为没有返回值
        }
        } catch (Exception e0) {
        throw new RuntimeException(e0);
        } finally {
        if (channel != null) {
        channel.disconnect();
        }
        if (session != null) {
        session.disconnect();
        }
        }
        }

      /**

      • 下载文件到本地

      • @saveLocalFile 保存到本地的文件 路径+文件名

      • @return 是否存在文件
        */
        public static boolean downloadLocal(String saveLocalFile, String fileName, String path, String host, int port, String user, String password) {
        Session session = null;
        ChannelSftp channel = null;
        boolean fileExist = true;//文件存在
        try {
        JSch jsch = new JSch();
        if (port == 0) {
        session = jsch.getSession(user, host);
        } else {
        session = jsch.getSession(user, host, port);
        }
        session.setPassword(password);
        session.setConfig(“StrictHostKeyChecking”, “no”);
        session.connect(connectTimeout);
        channel = (ChannelSftp) session.openChannel(“sftp”);
        channel.connect(connectTimeout);

         if (!(path == null || path.trim().length() == 0)) {
             channel.cd(path);//进入指定目录
         }
         File file = new File(saveLocalFile);
         if (file.exists()) {
             file.delete();
         }
        
         FileOutputStream fos = new FileOutputStream(file);
         channel.get(fileName,fos);//get()文件下载,文件不存在时会报错
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10

        } catch (SftpException e) {
        if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {//2: No such file
        fileExist = false;
        } else {
        throw new RuntimeException(e);//这个一定要捕捉异常,不然代码报错,为没有返回值
        }
        } catch (Exception e0) {
        throw new RuntimeException(e0);
        } finally {
        if (channel != null) {
        channel.disconnect();
        }
        if (session != null) {
        session.disconnect();
        }
        return fileExist;
        }
        }

      /**

      • 读取本地文件
      • @param saveLocalFile 文件路径+文件名
        */
        public static void readLocalFile(String saveLocalFile) {
        File file = new File(saveLocalFile);
        try {
        FileInputStream fis = new FileInputStream(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
        String line;
        while (stringIsNotEmpty(line = br.readLine())) {//一行一行的读取
        System.err.println(line);
        }
        fis.close();
        br.close();
        } catch (Exception e) {
        e.printStackTrace();
        }
        }

      /**

      • 创建并写入本地文件

      • @param createLocalFile 文件路径+文件名
        */
        public static File writeLocalFile(String createLocalFile) {
        File file = new File(createLocalFile);
        try {
        //①设置编码方式
        // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), “GBK”));

         //②不设置编码方式
         BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
         bw.write("我是java");
         bw.newLine();//换行,在不同的系统中会展示不同的符号,如果在Linux上不要读取到^M,则不应使用这种换行方式,直接在字符后面接\n
         bw.write("哇,哇哇");
         bw.newLine();
         bw.write("结束来了来了");
         bw.flush();//刷新缓冲流,把数据写进该文件。如果存在for循环,一定要在for循环里添加bw.flush()
         bw.close();
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9

        } catch (Exception e) {
        e.printStackTrace();
        }
        return file;
        }

      /**

      • 按条件删除本地文件
      • @param localPath 文件路径
        */
        public static void deleteLocalFile(String localPath,Date date) {
        File file = new File(localPath);
        for (String fileName : file.list()) {
        try {
        String pfile = localPath + fileName;//当前文件完整路径
        FileTime fileTime = Files.readAttributes(Paths.get(pfile), BasicFileAttributes.class).creationTime();//文件创建时间
        if (fileTime.toMillis() < date.getTime()) {//date大于创建时间
        File f = new File(pfile);
        if (!f.isDirectory()) {//非文件夹
        System.out.println(“删除文件===”+fileName);
        f.delete();//文件删除
        }
        }
        } catch (IOException e) {
        e.printStackTrace();
        }
        }
        }

      /**

      • 上传文件到服务器
        */
        public static void uploadLocalFile(File file, String path, String host, int port, String user, String password) {
        Session session = null;
        ChannelSftp channel = null;
        try {
        JSch jsch = new JSch();
        if (port == 0) {
        session = jsch.getSession(user, host);
        } else {
        session = jsch.getSession(user, host, port);
        }
        session.setPassword(password);
        session.setConfig(“StrictHostKeyChecking”, “no”);
        session.connect(connectTimeout);
        channel = (ChannelSftp) session.openChannel(“sftp”);
        channel.connect(connectTimeout);

         if (!(path == null || path.trim().length() == 0)) {
             channel.cd(path);//进入指定目录
         }
         InputStream is = new FileInputStream(file);
         channel.put(is, file.getName());
         is.close();
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6

        } catch (Exception e0) {
        throw new RuntimeException(e0);
        } finally {
        if (channel != null) {
        channel.disconnect();
        }
        if (session != null) {
        session.disconnect();
        }
        }
        }

      /**

      • 根据时间删除服务器上的文件
        */
        public static void removeDateFile(Date date, String path, String host, int port, String user, String password) {
        Session session = null;
        ChannelSftp channel = null;
        Vector vector = null;
        try {
        JSch jsch = new JSch();
        if (port == 0) {
        session = jsch.getSession(user, host);
        } else {
        session = jsch.getSession(user, host, port);
        }
        session.setPassword(password);
        session.setConfig(“StrictHostKeyChecking”, “no”);
        session.connect(connectTimeout);
        channel = (ChannelSftp) session.openChannel(“sftp”);
        channel.connect(connectTimeout);

         if (!(path == null || path.trim().length() == 0)) {
             channel.cd(path);//进入指定目录
             vector = channel.ls(path);//获取文件目录下所有的文件
         }
        
         for (Object item : vector) {
             ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) item;
             if (!entry.getAttrs().isDir()) {
                 String fileName = entry.getFilename();
                 if (".".equals(fileName) || "..".equals(fileName)) {
                     continue;
                 }
                 Date date1 = new Date(entry.getAttrs().getMTime() * 1000L);
                 if (date1.getTime() < date.getTime()) {
                     channel.rm(path + fileName);
                 }
             }
         }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18

        } catch (Exception e0) {
        throw new RuntimeException(e0);
        } finally {
        if (channel != null) {
        channel.disconnect();
        }
        if (session != null) {
        session.disconnect();
        }
        }
        }
        }

  • 相关阅读:
    【智慧医疗】Springboot+Vue+Element-UI前后端分离的医疗管理平台
    拥有这个中文版CustomGPT,你也能定制自己的AI问答机器人
    云原生网关的可观测性体系实践
    凹凸贴图如何提高物体的真实感
    经典卷积神经网络 - GoogLeNet
    MQ - 10 RocketMQ的架构设计与实现
    (2022 COLING)Context-Tuning情景化提示
    含文档+PPT+源码等]精品基于Nodejs实现的医院患者服务系统[包运行成功]
    C语言 : 文件的操作
    windows server 2012 R2的C盘空间满了,但是找不到大文件的两种原因
  • 原文地址:https://blog.csdn.net/weixin_43214644/article/details/126728789