我有一个用例,我在 Linux 文件系统上运行的模块应该被通知远程 Windows 共享中的任何新文件。
是否有任何内置功能?我做了一些基本的谷歌搜索,发现了一些文件观察器(C# 中的文件系统观察器)之类的东西。
它对 Java 6 有用吗?对于我必须在文件出现时下载文件的 FTP 调用来说,这将是多么容易和高效。
谢谢。
我有一个用例,我在 Linux 文件系统上运行的模块应该被通知远程 Windows 共享中的任何新文件。
是否有任何内置功能?我做了一些基本的谷歌搜索,发现了一些文件观察器(C# 中的文件系统观察器)之类的东西。
它对 Java 6 有用吗?对于我必须在文件出现时下载文件的 FTP 调用来说,这将是多么容易和高效。
谢谢。
从 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);
}
}
}