0

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

是否有任何内置功能?我做了一些基本的谷歌搜索,发现了一些文件观察器(C# 中的文件系统观察器)之类的东西。

它对 Java 6 有用吗?对于我必须在文件出现时下载文件的 FTP 调用来说,这将是多么容易和高效。

谢谢。

4

1 回答 1

2

从 java 7 开始就有一个文件观察器。有关此信息,请参见此处。我不确定这是否适用于远程 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);
        }
    }
}
于 2012-09-05T18:33:43.437 回答