我正在使用 JSch 库进行 SFTP。我需要在 SFTP 服务器上执行多项操作,例如移动其他目录中的远程文件、拉取文件等。对于我需要的所有这些操作Session
我从中得到Channel
然后将其投射到ChannelSftp
。这是多余的步骤。所以我想到将其抽象为private
method.
private ChannelSftp getChannelSftp() throws JSchException
{
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
Session session;
session = jsch.getSession(VENDOR1_USERID, VENDOR1_SERVER, VENDOR1_PORT);
session.setPassword(VENDOR1_PASSWORD);
session.setConfig(config);
session.connect();
ChannelSftp channelSftp = null;
Channel channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
return channelSftp;
}
但在 SFTP 操作之后我需要断开与通道和会话的连接both。
使用上述方法,虽然我可以断开连接Channel
在调用方法中但我无法断开连接Session
因为我没有它的实例,这可能是泄漏,所以我现在将其分成getSession()
方法和现在ChannelSftp
所有方法中都会重复创建。
有什么更好的方法设计/重构 it?
private Session getSession() throws JSchException
{
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
Session session;
session = jsch.getSession(VENDOR1_USERID, VENDOR1_SERVER, VENDOR1_PORT);
session.setPassword(VENDOR1_PASSWORD);
session.setConfig(config);
session.connect();
return session;
}
调用方法示例: - 指示重复的代码
public void sftp(File file) throws SftpException, FileNotFoundException, JSchException
{
Session session = getSession();
/* Duplicate code START*/
if ( session == null ) throw new SftpException(0 , "Service: Session is NULL");
ChannelSftp channelSftp = null;
Channel channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
/* Duplicate code END*/
channelSftp.cd(VENDOR1_PATH);
channelSftp.put(new FileInputStream(file), file.getName());
channelSftp.disconnect();
session.disconnect();
}