Я хотел бы прояснить ситуацию и прямо сейчас провести некоторые параллели между FileOutputStream и FileChannel.
Итак, прежде всего, похоже, что наиболее эффективным способом записи файла со стандартным вводом-выводом Java является использование FileOutputStream, который обернут BufferedOutputStream. Потому что он автоматически сбрасывается, когда внутренний буфер переполняется. Удобно иметь возможность делать одиночные записи (одиночные байты, числа с плавающей запятой и т. д.), а также записи массивов и не беспокоиться о скорости. Единственное, что вы никогда не должны забывать, это закрыть его (выполнить финальную промывку). Преимущества использования оболочки BufferedOutputStream очевидны и должны быть у всех (надеюсь).
Теперь о FileChannel. FileChannel имеет метод force, который эквивалентен flush в FileOutputStream, не так ли? И в javadocs ясно сказано, что вы должны использовать его, чтобы убедиться, что ваши изменения были внесены в целевой файл. Но я не понимаю, когда и зачем его использовать, если нет обертки BufferedFileChannel. Другими словами, где находится буферизация для FileChannel? Является ли он автоматическим и скрытым в самом FileChannel, как в BufferedOutputStream? Если нет, то с какой стати мне нужен принудительный метод, если нечего принудительно применять (все изменения уже применяются к файлу после использования метода записи) и я должен сам реализовывать буферизацию?