Scanner.hasNext () возвращает false при обычном запуске, но true при отладке - PullRequest
0 голосов
/ 04 июня 2018

Мне нужно прочитать некоторую информацию из файлов, как только они будут созданы в каталоге.Эти файлы создаются автоматически другой программой.Для этого я использую WatchService для наблюдения за созданием файла и Scanner для чтения файла.В основном методе у меня есть простой while(true), и мой класс Watcher называется.Это конструктор:

public Watcher(String srcDir, String targetDir) throws IOException, InterruptedException {
        this.srcDir = Paths.get(srcDir);
        this.targetDir = Paths.get(targetDir);

        this.watcher = this.srcDir.getFileSystem().newWatchService();
        this.srcDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE); // this will check ONLY for new files; no
                                                                             // deletions or modifications
        this.key = this.watcher.take();
    }

И метод, вызываемый в основном цикле (я удалил часть кода, потому что он не актуален):

public void checkForNewFile() throws IOException {
    String[] info = new String[6];
    if (this.watcher != null) {
        List<WatchEvent<?>> events = this.key.pollEvents();

        newFileName = "";
        for (WatchEvent event : events) {
            // I kept getting errors when trying to get only the last event
            newFileName = event.context().toString();
        }

        if(newFileName != "") {
            System.out.println("opening new file...");
            Scanner scanner = new Scanner(new FileInputStream(srcDir.toString() + "/" + newFileName));

            String line;
            System.out.println(scanner.hasNext());
            while(scanner.hasNext()) {
                line = scanner.nextLine();
                System.out.println("splitting lines...");
                String[] parts = line.split("|");
                ...
            }
            scanner.close();
        }
        this.key.reset();
    }
}

В методе выше, когдаЯ нормально запускаю программу, System.out.println(scanner.hasNext()); возвращает false и цикл while никогда не происходит, но при отладке код работает нормально.

Я знаю, что это указывает на проблемы с многопоточностью, но я явно не создаю никаких потоков, и этому проекту даже не нужно несколько потоков.Я делаю что-то неправильно?Что я могу сделать, чтобы этот код работал правильно?

1 Ответ

0 голосов
/ 04 июня 2018

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

Возможно, вы можете поиграться с блокировками файлов, чтобы избавиться от этой проблемы.

...