轮询SFTP服务器,有没有新文件?如果是,请将文件复制到本地

时间:2016-11-02 11:45:58

标签: java sftp file-watcher

我通过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目录提取,就像上面的本地工作一样。

2 个答案:

答案 0 :(得分:0)

Sftp比本地文件系统复杂一点。因此,这里的解决方案https://github.com/drapostolos/rdp4j看起来令人困惑。在大多数情况下,您关心的只是侦听器类,将您的copyToLocal函数插入到侦听器中以处理您所关注的事件("添加/删除")。我认为这是一个很好的解决方案,而不是那里的任何东西。

答案 1 :(得分:-3)

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