Мне нужно прочитать некоторую информацию из файлов, как только они будут созданы в каталоге.Эти файлы создаются автоматически другой программой.Для этого я использую 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
никогда не происходит, но при отладке код работает нормально.
Я знаю, что это указывает на проблемы с многопоточностью, но я явно не создаю никаких потоков, и этому проекту даже не нужно несколько потоков.Я делаю что-то неправильно?Что я могу сделать, чтобы этот код работал правильно?