Подтвердить что ты не робот

Концепция ввода-вывода flush vs sync

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

В C, fflush (stdin), убедитесь, что буфер очищен. И fsync, чтобы сохранить файл изменений на диске.

Если эти понятия не определены повсеместно, предпочли бы объяснение linux, java.

Я нашел связанный пост, но я не отвечаю на мой вопрос. На самом деле принудительная синхронизация файлов/флеш в Java

4b9b3361

Ответ 1

В Java метод flush() используется в потоках вывода и писателях для обеспечения того, чтобы буферизованные данные были выписаны. Однако, согласно Javadocs:

Если предполагаемый пункт назначения этого потока является абстракцией, предоставляемой базовой операционной системой, например файлом, то очистка потока гарантирует, что только байты, ранее записанные в поток, передаются в операционную систему для записи; он не гарантирует, что они фактически записаны на физическое устройство, такое как дисковод.

С другой стороны, FileDescriptor.sync() может использоваться для обеспечения того, чтобы данные, буферизованные ОС, записывались на физическое устройство (диск). Это то же самое, что вызов sync в Linux/POSIX.

Если вашему Java-приложению действительно необходимо обеспечить физическую запись данных на диск, вам может потребоваться flush и sync, например:

FileOutputStream out = new FileOutputStream(filename);

[...]

out.flush();
out.getFD().sync();

Литература: