java使用Jsch来获取sftp上指定文件名的文件

查看jsch包中列出文件名的方法

通过jsch获取ChannelSftp。ChannelSftp中有相应的列出,删除等一系列文件操作。找出其中的列出文件方法。包含两个

public java.util.Vector ls(String path) throws SftpException

public void ls(String path, LsEntrySelector selector) throws SftpException

第一个方法会列出路径下所有文件名。第二个方法会有个选择器,用来筛选文件。其实第一个方法就调用了第二个方法,只不过筛选的是全部。

查看选择器

上面第二个方法多了个选择器的参数,可以看一下这个选择器

这是个接口,需要我们自己实现选择器,接口上面说是 “该接口作为方法参数传递给ls方法”

然后接口唯一的select方法的说明为:“此select方法会invoke进ls方法的每一个文件entry,如果该方法返回BREAK,则ls方法会立即停止”

其实就是,你实现该接口,每调一次ls方法,就会通过该选择器,该选择器决定了每一个文件的去留,也决定了ls方法的中止或继续。

举例

比如我想列出20210615.txt结尾的文件。从50万个文件里,

下面是代码

public static void getDirList(String ftpHost, String ftpUserName,
                                  String ftpPassword, int ftpPort, String ftpPath) throws Exception{
        Session session = null;
        Channel channel = null;
        ChannelSftp chSftp=null;
        JSch jsch = new JSch();
        try {
            session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
            session.setPassword(ftpPassword);
            session.setTimeout(100000);
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();

            channel = session.openChannel("sftp");
            channel.connect();
            chSftp = (ChannelSftp) channel;

            long t1 = System.currentTimeMillis();

            //定义selector,用来过滤出来20210615.txt的文件
            List<String> needShowFileList = new ArrayList<String>();
            ChannelSftp.LsEntrySelector selector = new ChannelSftp.LsEntrySelector() {

                @Override
                public int select(ChannelSftp.LsEntry entry) {
                    //指定文件名的文件,加入集合中
                    if(entry.getFilename().endsWith("20210615.txt")){
                        needShowFileList.add(entry.getFilename());
                        return CONTINUE;
                    }
                    //碰见 ..结尾的不添加进集合中,
                    if (".".equals(entry.getFilename()) || "..".equals(entry.getFilename())) {
                        return CONTINUE;
                    }
                    //不符合条件的文件直接跳过
                    return CONTINUE;
                }
            };
            //列出
            chSftp.ls(ftpPath,selector);

            long t2 = System.currentTimeMillis();
            System.out.println("获取文件花费时间:" + (t2 - t1)+"ms");
            System.out.println(needShowFileList.toString());
        } catch (Exception e) {
            //logError(e);
            //return null;
        } finally {
            if (chSftp != null) {
                chSftp.quit();
            }
            if (channel != null) {
                channel.disconnect();
            }
            if (session != null) {
                session.disconnect();
            }
        }
    }

结果

文件数量

see ya

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值