Изменяемый файл параметров для программы Java - PullRequest
0 голосов
/ 22 октября 2018

Я создал программу для своего работодателя, и одна из возможностей заключалась в том, что сотрудники, не работающие с программным обеспечением, могут изменять свойства в нескольких различных файлах параметров.Например (что-то, чего на самом деле нет в программе), я поместил параметр «volume», который пользователь может изменить, в volume.txt.

Однако, похоже, что при запуске самого файла JAR изменение этих значений не влияет на программу.Могу ли я предположить, что когда я создаю артефакт, java встраивает файл в файл jar?Я изменил значения для файла параметров как в исходном, так и в производстве артефактов, но ничего не изменилось.Как это исправить, чтобы изменения в файле были прочитаны?Должен ли я создать артефакт без файлов в исходной папке и вместо этого поместить их в расположение исполняемого файла jar?Спасибо!

1 Ответ

0 голосов
/ 22 октября 2018

Файлы свойств, которые могут быть отредактированы вашими пользователями, должны находиться в каталоге, к которому у ваших пользователей есть доступ, и где они не могут навредить.

В вашем вопросе неясно, но я предполагаю, что свойстваможет быть изменено во время работы вашего приложения.Для обнаружения изменений в файле вы можете использовать java.nio.file.WatchService.

Я создал небольшую демонстрационную программу для вас.Надеюсь, это поможет.

import java.io.IOException;
import java.nio.file.*;

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

public class Main {

    private static String WATCH_DIR = "c:/temp";
    private static String WATCH_FILE_NAME = "volume.txt";

    public static void main(String[] args) {
        FileSystem fileSystem = FileSystems.getDefault();
        try (final WatchService watchService = fileSystem.newWatchService()) {
            fileSystem.getPath(WATCH_DIR).register(watchService, ENTRY_MODIFY);
            while (true) {
                final WatchKey watchKey = watchService.take();

                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    // "ENTRY_MODIFY" so context will be an instance of Path.
                    final Path changed = (Path) event.context();
                    if (changed.endsWith(WATCH_FILE_NAME)) {
                        System.out.println("Volume.txt was changed");
                    }
                }

                if (!watchKey.reset()) {
                    System.out.println("Key invalid");
                }
            }
        } catch (IOException | InterruptedException e) {
            System.out.println("Oops, something is not working");
            e.printStackTrace();
        }

    }
}
...