Java工具类之SFTP遍历查找指定目录下包含关键字的的所有文件
SFTP遍历查找指定目录下包含关键字的的所有文件
·
目录
一、工具类代码
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();
}
}
更多推荐


所有评论(0)