8

今、それを明確にして、FileOutputStreamとFileChannelの間にいくつかの類似点を描きたいと思います。

したがって、まず第一に、標準のJava ioでファイルを書き込む最も効率的な方法は、BufferedOutputStreamでラップされたFileOutputStreamを使用することであるように思われます。自動的にフラッシュするため、内部バッファがオーバーフローした場合。配列の書き込みだけでなく、シングル書き込み(シングルバイト、フロートなど)も実行でき、速度を気にしないと便利です。決して忘れてはならない唯一のことは、それを閉じることです(最後のフラッシュを実行するため)。BufferedOutputStreamラッパーを使用する利点は明らかであり、すべての人にとって必要です(私は願っています)。

次にFileChannelについて。FileChannelには、FileOutputStreamのflushと同等のforceメソッドがありますね。そしてjavadocsは、ターゲットファイルに変更が加えられたことを確認するためにそれを使用する必要があることを明確に述べています。しかし、「BufferedFileChannel」ラッパーがない場合、いつ、なぜそれを使用する必要があるのか​​わかりません。言い換えれば、FileChannelのバッファリングはどこにありますか?それは自動で、BufferedOutputStreamのようにFileChannel自体に隠されていますか?そうでない場合は、強制するものがないため(writeメソッドを使用した後、すべての変更がファイルにすでに適用されているため)、なぜforceメソッドが必要になるのでしょうか。また、自分でバッファリングを実装する必要がありますか?

4

1 に答える 1

13

BufferedOutputStreamjavaにキャッシュがありますが、ありFileChannelません。

ただし、FileChannelOSレベルのキャッシュがあります。/と.force()同じです。fsyncfdatasync

OpenJDK6では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 }

このレベルでOSがどのように機能するかについて詳しく知りたい場合は、このブログをお読みください。

于 2011-01-20T02:12:38.273 に答える