Есть ли какой-нибудь способ открыть файл в Unix для записи, которая блокирует (что на самом деле ждет, пока данные будут в файле, прежде чем завершить операцию «записи»?
У меня есть программаэто берет строки результата из списка и записывает их в файл.
Моя текущая реализация выглядит следующим образом (я удалил обработку, выполненную в каждой строке)
ArrayList<String> lines = new ArrayList<>();
BufferedReader in = new BufferedReader(new FileReader(inFile));
String line;
while((line = in.readLine()) != null){
lines.add(line);
}
int written = 0;
PrintWriter out = new PrintWriter(new FileWriter(outFile));
for(String l : lines){
written++;
out.println(l);
if(written % 10000 == 0)
Message.info("lines written "+written);
}
out.close();
Текущее поведение выглядит следующим образом:[17:12:43 INFO] написано 10000 строк[17:12:43 INFO] написано 20000 строк[17:12:43 INFO] написано 30000 строк[17:12:44 INFO] написано 40000 строк[17:12:44 INFO] написано 50000 строк[17:12:44 INFO] написано 60000 строк[17:12:45 INFO] написано 70000 строк[17:12:45 INFO] написано 80000 строк[17:12:45 INFO] написано 90000 строк[17:12:46 INFO] написано 100000 строк
Если программа работает очень быстро, но в конце ожидает (30-40 секунд) всех данных (4Go), которые будут записаны в файл, прежде чем завершится.(я вижу, как файл растет на диске за это время)Когда я хочу, чтобы мое сообщение INFO отображалось только тогда, когда данные действительно находятся в файле: программа будет работать медленнее, но завершится сразу после последнего сообщения.
Я пытался использовать BufferedWriter (изnew BufferedWriter () и Files.newBufferedWriter ()), FileOutputStream, OutputStream, но кажется, что все они предлагают только неблокирующую операцию ввода-вывода
Программа работает в Ubuntu (я читал, что реализация зависит от файловой системы)
Итак, есть ли способ дождаться завершения операции println () / write () перед выполнением следующей строки кода?
Я "чувствую", что java делегированфактическая запись в ОС и не ожидает, пока данные на диске будут продолжаться, но, поскольку java ожидает завершения последней записи перед завершением, должен быть способ ожидания после каждой строки