Filewatcher在java中查看windows文件夹并通知linux

时间:2012-09-05 18:32:00

标签: java ftp filesystemwatcher

我有一个用例,我的模块在Linux文件系统上运行,应该通知远程Windows共享中的任何新文件。

这有内置功能吗?我做了一些基本的谷歌搜索,发现了一些filewatcher(C#中的Filesystemwatcher)。

对Java 6有用吗? FTP调用的简单性和高效性,我必须在文件出现时下载文件。

感谢。

1 个答案:

答案 0 :(得分:2)

从java 7开始有一个文件监视器。有关此问题的跟踪,请参阅here。我不确定这是否适用于远程Windows共享,因此可能值得尝试一下。

如果你不能使用java 7那么可能值得使用ScheduledExecutor(从java 5开始)并手动检查远程目录的每x秒

修改

不确定您建议的库是否需要java 7。编写扫描内容并不难,所以我在单元测试中为您编写了以下内容。我没有测试它,所以它可能有几个错误,但它应该几乎在那里。它基本上每秒扫描一个目录,然后打印到已添加或删除的sysout文件。它会检查您指定的目录和所有子目录。

public void test() {
    ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
        ex.scheduleAtFixedRate(new Runnable(){
    @Override
    public void run() {
        scanDirectory(new File("."));
    }}, 1, 1, TimeUnit.SECONDS);
}

private void scanDirectory(File directory) {
    Set<File> before = new HashSet<File>();
    Set<File> after = new HashSet<File>();
    addFiles(directory, after);

   for (File f :after) {
      if (!before.contains(f)) {
         System.out.format("new file added %s", f);     
      }
   }
   for (File f :before) {
        if (!after.contains(f)) {
            System.out.format("file removed %s", f);    
        }
    }

    before.clear();
    before.addAll(after);
}

private void addFiles(File file, Collection<File> allFiles) {
    File[] files = file.listFiles();
    if (files != null) {
        for (File f : files) {
            allFiles.add(f);
            addFiles(f, allFiles);
        }
    }
}