我在JDK7中使用Watcher,它依赖于inotify事件。如果文件在NFS上,我希望我的程序回退并使用轮询。有没有办法检测文件是否在远程驱动器上(除了使用Runtime.exec并解析挂载表)?我现在只关心Linux的兼容性。
我想一个选项是在程序启动时同时使用inotify和polling,但如果为我的文件创建了inotify事件,则禁用轮询线程。
答案 0 :(得分:0)
您应该能够使用FileStore.type()获得有关基础文件系统类型的相对可靠的信息。
它肯定会告诉你它是NFS还是CIFS,不确定其他网络挂载类型。
但是我没有关于它有多可靠的信息,@ hoaz建议检查事件是否正确,这可能是一个好主意。
答案 1 :(得分:0)
我遇到了同样的问题。我已经通过在de main类中创建一个新线程并定期触摸文件来解决它,因此会触发一个新的更改事件。
样本每隔10秒轮询dir一次。
以下是代码示例:
package com.ardevco.files;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.util.ArrayList;
import java.util.List;
public class Touch implements Runnable {
private Path touchPath;
public Touch(Path touchPath) {
this.touchPath = touchPath;
this.checkPath = checkPath;
}
public static void touch(Path file) throws IOException {
long timestamp = System.currentTimeMillis();
touch(file, timestamp);
}
public static void touch(Path file, long timestamp) throws IOException {
if (Files.exists(file)) {
FileTime ft = FileTime.fromMillis(timestamp);
Files.setLastModifiedTime(file, ft);
}
}
List<Path> listFiles(Path path) throws IOException {
final List<Path> files = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
for (Path entry : stream) {
if (Files.isDirectory(entry)) {
files.addAll(listFiles(entry));
}
files.add(entry);
}
}
return files;
}
@Override
public void run() {
while (true) {
try {
for (Path path : listFiles(touchPath)) {
touch(path);
}
} catch (IOException e) {
System.out.println("Exception: " + e);
}
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
System.out.println("Exception: " + e);
}
}
}
}