java查询目录下所有文件

目录 一、工具类代码 二、pom文件 三、核心代码示例 四、补充:秘钥证书登录 一、工具类代码 public class SFTPUtil { private transient Logger logger = LoggerFactory.getLogger(this.getClass()); private ChannelSftp sftp; private

目录

一、工具类代码

二、pom文件

三、核心代码示例

四、补充:秘钥证书登录 


一、工具类代码

public class SFTPUtil {
    private transient Logger logger = LoggerFactory.getLogger(this.getClass());

    private ChannelSftp sftp;

    private Session session;
    /**
     * SFTP 登录用户名
     */
    private String username;
    /**
     * SFTP 登录密码
     */
    private String password;
    /**
     * SFTP 服务器地址IP地址
     */
    private String host;
    /**
     * SFTP 端口
     */
    private int port;


    /**
     * 构造基于密码认证的sftp对象
     */
    public SFTPUtil(String username, String password, String host, int port) {
        this.username = username;
        this.password = password;
        this.host = host;
        this.port = port;
    }

   

    public SFTPUtil() {
    }


    /**
     * 连接sftp服务器
     */
    public void login() {
        try {
            JSch jsch = new JSch();
            if (privateKey != null) {
                jsch.addIdentity(privateKey);// 设置私钥
                jsch.addIdentity(privateKey, pripass);
            }

            session = jsch.getSession(username, host, port);

            if (password != null) {
                session.setPassword(password);
            }
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();

            sftp = (ChannelSftp) channel;
        } catch (JSchException e) {
            e.printStackTrace();
            logger.info("sftp login exception:{}", e);
        }
    }

    /**
     * 关闭连接 server
     */
    public void logout() {
        if (sftp != null) {
            if (sftp.isConnected()) {
                sftp.disconnect();
            }
        }
        if (session != null) {
            if (session.isConnected()) {
                session.disconnect();
            }
        }
    }

  


    /**
     * 下载文件。
     *
     * @param directory    下载目录
     * @param downloadFile 下载的文件
     * @param saveFile     存在本地的路径
     */
    public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException {
        if (directory != null && !"".equals(directory)) {
            sftp.cd(directory);
        }
        File file = new File(saveFile);
        sftp.get(downloadFile, new FileOutputStream(file));
    }




    /**
     * 删除文件
     *
     * @param directory  要删除文件所在目录
     * @param deleteFile 要删除的文件
     */
    public void delete(String directory, String deleteFile) throws SftpException {
        sftp.cd(directory);
        sftp.rm(deleteFile);
    }


    /**
     * 列出目录下的文件
     *
     * @param directory 要列出的目录
     */
    public Vector<?> listFiles(String directory) throws SftpException {
        return sftp.ls(directory);
    }


    public List<String> getdownloads(String fileName, String contains) throws SftpException {
        List<String> list = new ArrayList<String>();
        logger.info("下载中。。");
        Vector vector = listFiles(fileName);
        for (int i = 0; i < vector.size(); i++) {
            ChannelSftp.LsEntry entry = (LsEntry) vector.get(i);
            if (entry.getFilename().contains(contains)) {
                list.add(entry.getFilename());
            }
        }
        return list;
    }

}

二、pom文件

<dependency>
   <groupId>com.jcraft</groupId>
   <artifactId>jsch</artifactId>
   <version>0.1.53</version>
</dependency>

三、核心代码示例

public String downloadFile(String date) {
    String comPath = null;
    try {
        SFTPUtil sftp = new SFTPUtil(UserName, hPassWord, Host, Integer.parseInt(port));
        sftp.login();
        logger.info("登录sftp");
        TextUtil.createFile(filePath+"/"+date+"/"+iceName+"/");
        List<String> list=sftp.getdownloads(SftpPath, date);
        for (int i = 0; i < list.size(); i++) {
            String file=list.get(i);
            comPath = filePath+"/"+date+"/"+iceName+"/"+file;
            logger.info("下载文件名:" + comPath);
            sftp.download(SftpPath, file,comPath);
        }
        sftp.logout();
        return comPath;
    } catch (SftpException e) {
        logger.error("下载失败:", e);
        return null;
    } catch (IOException e) {
        logger.error("下载失败:", e);
        return null;
    }
}

public class TextUtil {
   /**
    * 创建目录
    * @return
    * @throws IOException 
    */
   public static void createFile(String fileName) throws IOException{
      File file = new File(fileName); 
      if(!file.exists()){ 
       file.mkdirs(); 
      }
   }
}

四、补充:秘钥证书登录 

import com.jcraft.jsch.*;


import java.util.Vector;

public class LoginTest {

    //SFTP地址
    private static final String HOST = "IP地址";
    //端口
    private static final int PORT = 2222;
    //用户名
    private static final String USERNAME = "adminabc";
    //证书路径
    private static final String PRIVATE_KEY_PATH = "E://03/abc.rsa";
    //SFTP文件目录
    private static final String sftpPath = "/aa/bb/cc";
    //本地测试目录
    private static final String localFilePath = "E://04/";
    //下载关键字
    private static final String keyWord = "20240123";


    public static void loginWithCertificate() {
        //创建 JSch 实例
        JSch jsch = new JSch();
        try {
            jsch.addIdentity(PRIVATE_KEY_PATH);
            //创建 SSH 会话
            Session session = jsch.getSession(USERNAME, HOST, PORT);
            /**
             * 设置了会话的配置。StrictHostKeyChecking 是一个 SSH 选项,用于控制 SSH 客户端如何处理未知的主机密钥。
             * "yes" 表示客户端会检查主机密钥,"no" 表示客户端会忽略主机密钥,"ask" 表示客户端会提示用户是否接受主机密钥。
             * 设置为 "no" 表示客户端不会检查主机密钥是否已知,这可能会导致“man in the middle”攻击,因此只应在测试环境中使用。
             */
            session.setConfig("StrictHostKeyChecking", "no");
            //连接 SSH 服务器,会话将尝试与服务器建立连接
            session.connect();
            //通过调用 openChannel("sftp") 方法,客户端请求一个 SFTP 通道。此方法返回一个 ChannelSftp 对象,该对象可用于执行 SFTP 操作。
            Channel channel = session.openChannel("sftp");
            //连接 SFTP 通道,通道将尝试与服务器建立连接
            channel.connect();
            //将 channel 强制转换为 ChannelSftp 类型,并将其赋值给 sftpChannel 变量。
            //使用 sftpChannel 对象来执行各种 SFTP 操作,例如上传/下载文件、列出目录等
            ChannelSftp sftpChannel = (ChannelSftp) channel;

            //登录部分在这里就已经完成了,如果要做成工具类,可以从这里到异常抛出,中间这一部分代码提出

            //登录以后,下载指定目录的文件
            //判断某路径下文件是否存在,如果存在,下载该路径下所有文件
            if (!isDirExist(sftpPath,sftpChannel)) {
                //当前文件目录存在
                System.out.println("目标目录不存在!");
                return;
            }

            //方法通常用于从 SFTP 服务器下载单个文件。如果要下载整个文件夹,通常需要遍历文件夹
            Vector vector = sftpChannel.ls(sftpPath);
            for (int i = 0; i < vector.size(); i++) {
                ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) vector.get(i);
                System.out.println("entry.getFilename():" + entry.getFilename());
                if (entry.getFilename().contains(keyWord)) {
                    sftpChannel.get(sftpPath+"/"+entry.getFilename(), localFilePath+"/"+entry.getFilename());
                }
            }

            sftpChannel.disconnect();
            session.disconnect();
        } catch (JSchException e) {
            System.out.println("JSchException");
            e.printStackTrace();
        } catch (SftpException e) {
            System.out.println("SftpException");
            throw new RuntimeException(e);
        }
    }

    /**
     * 判断目录是否存在
     */
    public static boolean isDirExist(String directory, ChannelSftp sftp) {
        boolean isDirExistFlag = false;
        try {

            //ChannelSftp 是 JSch 中用于 SFTP (SSH 文件传输协议) 的一个类。
            //lstat() 是 ChannelSftp 类的一个方法,用于获取文件或目录的详细信息,但不包括其内容。
            //它返回一个 SftpATTRS 对象,该对象包含有关文件或目录的信息,如权限、所有者、大小等。
            SftpATTRS sftpATTRS = sftp.lstat(directory);
            isDirExistFlag = true;
            return sftpATTRS.isDir();
        } catch (Exception e) {
            if ("no such file".equals(e.getMessage().toLowerCase())) {
                isDirExistFlag = false;
            }
        }
        return isDirExistFlag;
    }

    public static void main(String[] args) {
        loginWithCertificate();
    }
}

知秋君
上一篇 2024-07-08 08:36
下一篇 2024-07-08 08:02

相关推荐