0

我正在通过 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 服务器的目录。那我该怎么做呢?我找到了一个指向这一点的解决方案。但它包含很多类,而且太混乱了,因为我可以使用下面的程序对本地机器进行相同的轮询。

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 目录获取,如上述本地工作。

4

2 回答 2

0

Sftp 比本地文件系统复杂一些。因此这里的解决方案https://github.com/drapostolos/rdp4j看起来很混乱。在大多数情况下,您所关心的只是侦听器类,将您的 copyToLocal 函数插入到您关心的事件的侦听器中(“添加/删除”)。我觉得这是一个很好的解决方案,而不是那里的任何东西。

于 2016-11-03T20:21:06.617 回答
-3

我不会用 Java 来做...我会设置一个 cron 作业来同步远程到本地,然后每 10 分钟运行一次。

于 2016-11-03T15:43:41.633 回答