我通过SO找到解决方案,但我无法得到正确的解决方案。 实际上我从SFTP服务器到本地的复制文件中得到了以下程序:
public class SFTP_logic {
public static void main(String args[]) {
String Username = "abc";
String Host = "ftp.abc.com";
int port = 22;
String Password="abc123";
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession(Username, Host, port);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(Password);
session.connect();
System.out.println("connected..");
Channel channel = session.openChannel("sftp");
channel.connect();
// System.out.println("---------------------Connected to SFTP server.----------------------");
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("abc_20161031.txt.xyz", "localfile.txt");
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
}
我的要求: - 我需要每10分钟轮询一次SFTP服务器的目录,是否有新文件,如果是,则必须将该文件复制到本地。
所以,我的问题是我想使用JAVA轮询SFTP服务器的目录。那我该怎么做呢?我找到一个指向this的解决方案。但它包含很多类,而且太混乱了,因为我可以使用以下程序为本地机器进行相同的轮询。
public class MonitorDirectory {
public static void main(String[] args) throws IOException,
InterruptedException {
Path faxFolder = Paths.get("C:\\Users\\Yash\\Documents");
WatchService watchService = FileSystems.getDefault().newWatchService();
faxFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
boolean valid = true;
do {
WatchKey watchKey = watchService.take();
for (WatchEvent event : watchKey.pollEvents()) {
WatchEvent.Kind kind = event.kind();
if (StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind())) {
String fileName = event.context().toString();
System.out.println("File Created:" + fileName);
}
}
valid = watchKey.reset();
} while (valid);
}
}
那么,是否有任何代码适用于SFTP目录提取,就像上面的本地工作一样。
答案 0 :(得分:0)
Sftp比本地文件系统复杂一点。因此,这里的解决方案https://github.com/drapostolos/rdp4j看起来令人困惑。在大多数情况下,您关心的只是侦听器类,将您的copyToLocal函数插入到侦听器中以处理您所关注的事件("添加/删除")。我认为这是一个很好的解决方案,而不是那里的任何东西。
答案 1 :(得分:-3)
我不会用Java做...我设置了一个cron作业来将远程同步到本地,并且每隔10分钟运行一次。