Наличие операции блокирующей записи в файл Unix - PullRequest
0 голосов
/ 19 сентября 2019

Есть ли какой-нибудь способ открыть файл в 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 ожидает завершения последней записи перед завершением, должен быть способ ожидания после каждой строки

1 Ответ

0 голосов
/ 24 сентября 2019

грязный обходной путь : каждые 10000 строк я закрываю файл и снова открываю его, используя StanddardOpenOption.APPEND.Это имеет ожидаемое поведение только с приемлемыми временными издержками.

чистое решение : откройте файл с помощью `StanddardOpenOption.SYNC.Это имеет ожидаемое поведение с STRONG накладными расходами времени

...