用Java检测远程文件

时间:2014-03-03 02:50:57

标签: java nio nfs inotify

我在JDK7中使用Watcher,它依赖于inotify事件。如果文件在NFS上,我希望我的程序回退并使用轮询。有没有办法检测文件是否在远程驱动器上(除了使用Runtime.exec并解析挂载表)?我现在只关心Linux的兼容性。

我想一个选项是在程序启动时同时使用inotify和polling,但如果为我的文件创建了inotify事件,则禁用轮询线程。

2 个答案:

答案 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);
            }
        }

    }

}