цикл, чтобы проверить, существует ли файл - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть папка, которая должна всегда содержать один файл config8 , и если в этой папке создается новый файл, старый файл удаляется и заменяется новым файлом с тем же именем config8 .

Я пишу этот код

       File file1 = new File("/home/olfa/Bureau/config/config8");
       File file2 = new File("/home/olfa/Bureau/config/config9");
      while (file2.exists())
      {
          file1.delete();
          file2.renameTo(file1); }
      }
    serverConnection = new ServerConnection("/home/olfa/Bureau/config/config8");

Мне нужно добавить цикл, чтобы каждый раз проверять, создан ли config9.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Если вам нужно решить эту задачу с Java 1.6, вы можете использовать https://commons.apache.org/proper/commons-vfs/, версия 2.1.

Вот пример для перемещения всех входящих файлов конфигурации в «config8»:

import org.apache.commons.vfs2.*;
import org.apache.commons.vfs2.impl.DefaultFileMonitor;

import java.io.File;

public class ConfigWatcher {
    private static final String configDirName = "target/config";
    private static final String configName = "config8";
    private static final String absoluteConfigName = new File(configDirName + File.separator + configName).getAbsolutePath();
    private FileSystemManager manager = null;
    FileObject configDir = null;
    private FileObject configFile = null;
    private FileChangeEvent lastEvent = null;

    public void watchConfig() throws Exception {
        manager = VFS.getManager();

        DefaultFileMonitor fm = new DefaultFileMonitor(new ConfigFileListener());
        configFile = manager.resolveFile(absoluteConfigName);
        configDir = manager.resolveFile(new File(configDirName).getAbsolutePath());
        fm.setDelay(1000);
        fm.addFile(configDir);
        fm.start();
    }

    class ConfigFileListener implements FileListener {
        public void fileCreated(FileChangeEvent fileChangeEvent) throws Exception {
            FileObject latestConfigFile = fileChangeEvent.getFile();
            String fileBaseName = fileChangeEvent.getFile().getName().getBaseName();
            if (!configName.endsWith(fileBaseName) && !fileChangeEvent.equals(lastEvent)) {
                System.out.println("new config detected - move config");
                latestConfigFile.moveTo(configFile);
            }
            lastEvent = fileChangeEvent;
        }

        public void fileChanged(FileChangeEvent fileChangeEvent) {
        }

        public void fileDeleted(FileChangeEvent fileChangeEvent) {
        }
    }


    public static void main(String[] args) throws Exception {
        final ConfigWatcher configWatcher = new ConfigWatcher();
        configWatcher.watchConfig();
        while (true) {
            Thread.sleep(1000);
        }
    }
}
0 голосов
/ 13 ноября 2018

Вместо цикла попробуйте WatchService.

По сути, вы будете наблюдать за конкретным каталогом на предмет изменений, а затем сможете реагировать на это изменение.

https://docs.oracle.com/javase/tutorial/essential/io/notification.html

Например:

import static java.nio.file.StandardWatchEventKinds.*;

WatchService watcher = FileSystems.getDefault().newWatchService();

Path dir = ...;
try {
    WatchKey key = dir.register(watcher,
                       ENTRY_CREATE,
                       ENTRY_DELETE,
                       ENTRY_MODIFY);
} catch (IOException x) {
System.err.println(x);
}

Затем вы можете обработать ваши ключевые события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...