FileChannel # force и буферизация - PullRequest
4 голосов
/ 20 января 2011

Я хотел бы прояснить и провести некоторые параллели между FileOutputStream и FileChannel прямо сейчас.

Итак, во-первых, кажется, что наиболее эффективный способ написания файла со стандартным Java io - этоиспользовать FileOutputStream, который обернут в BufferedOutputStream .Потому что он автоматически сбрасывается при переполнении внутреннего буфера.Удобно иметь возможность делать одиночные записи (одиночные байты, числа с плавающей запятой и т. Д.), А также массивы и не беспокоиться о скорости.Единственное, что вы никогда не должны забывать, это закрыть его (выполнить последний сброс).Преимущества использования оболочки BufferedOutputStream очевидны, и должно иметь для всех (я надеюсь).

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

1 Ответ

9 голосов
/ 20 января 2011

BufferedOutputStream имеет кеш в java , который FileChannel не имеет.

Однако, FileChannel имеет кеш на уровне ОС. В котором .force() совпадает с fsync / fdatasync.

В OpenJDK 6 src/solaris/native/sun/nio/ch/FileChannelImpl.c

  157 JNIEXPORT jint JNICALL
  158 Java_sun_nio_ch_FileChannelImpl_force0(JNIEnv *env, jobject this,
  159                                        jobject fdo, jboolean md)
  160 {
  161     jint fd = fdval(env, fdo);
  162     int result = 0;
  163 
  164     if (md == JNI_FALSE) {
  165         result = fdatasync(fd);
  166     } else {
  167         result = fsync(fd);
  168     }
  169     return handle(env, result, "Force failed");
  170 }

Читайте этот блог , если вы хотите узнать больше, как ОС работает на этом уровне.

...