查看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