Флэш-концепция ввода-вывода против синхронизации - PullRequest
34 голосов
/ 01 ноября 2010

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

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

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

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

1 Ответ

66 голосов
/ 01 ноября 2010

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

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

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

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

FileOutputStream out = new FileOutputStream(filename);

[...]

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

Ссылки:

...