Обнаружение удаленных файлов в Java

Я использую Watcher в JDK7, который использует события inotify. Если файл находится в NFS, я хочу, чтобы моя программа откатилась и вместо этого использовала опрос. Есть ли способ определить, находится ли файл на удаленном диске (кроме использования Runtime.exec и анализа таблицы монтирования)? Меня пока интересует только совместимость с Linux.

Я полагаю, что одним из вариантов является использование как inotify, так и опроса при запуске программы, но затем отключить поток опроса, если создается событие inotify для моего файла.


person beardedlinuxgeek    schedule 03.03.2014    source источник
comment
Вы можете попробовать inotify и обновить файл программно. Если вы получаете событие, то все хорошо, если нет — переключайтесь на опрос.   -  person hoaz    schedule 03.03.2014
comment
В документации java.nio.file.WatchService подразумевается, что реализация службы наблюдения будет возвращаться к опросу, если нет лучшего механизма для использования в конкретном случае. Возможно, что он будет работать и для файловой системы NFS из коробки, и вам не придется реализовывать опрос самостоятельно.   -  person Oleg Estekhin    schedule 03.03.2014
comment
@OlegEstekhin это должен быть ответ   -  person Oleg Mikheev    schedule 03.03.2014


Ответы (2)


Вы должны быть в состоянии получить относительно надежную информацию о базовом типе файловой системы с помощью FileStore.type().

Он обязательно скажет вам, является ли это NFS или CIFS, не уверен в других типах сетевого подключения.

Однако у меня нет информации о том, насколько это надежно, предложение @hoaz проверить, происходят ли события, может быть хорошей идеей.

person Oleg Mikheev    schedule 03.03.2014

У меня такая же проблема. Я решил это, создав новый поток в основном классе и периодически касаясь файлов, чтобы было запущено новое событие изменения.

Образец опрашивает директор каждые 10 секунд, делает касание.

Вот пример кода:

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

    }

}
person Mehmet Erdemsoy    schedule 01.05.2015