我想澄清一下,现在就在FileOutputStream和FileChannel之间画出一些相似之处。

因此,首先,似乎是使用标准Java io写入文件的最有效方法是使用FileOutputStream,该文件包装有BufferedOutputStream 。当内部缓冲区溢出时,由于它会自动刷新。能够进行单次写入(单字节,浮点数等)以及数组写入,而不必担心速度,这是很方便的。您永远不会忘记的唯一事情就是关闭它(执行最后的冲洗)。使用BufferedOutputStream包装器的好处显而易见,而且对每个人都必须具有(我希望如此)。

现在关于FileChannel。 FileChannel具有force方法,等效于FileOutputStream中的flush,不是吗? 并且javadocs明确指出,您应该使用它来确保已对目标文件进行了更改。但是,如果没有“BufferedFileChannel”包装器,我不知道何时以及为什么要使用它。 换句话说,FileChannel的缓冲在哪里?它是自动的并且像BufferedOutputStream中一样隐藏在FileChannel本身中吗?如果不是,那么为什么我真的需要强制方法,因为没有什么可以强制执行的(使用write方法后所有更改都已应用到文件中),我是否必须自己实现缓冲?

最佳答案

BufferedOutputStream在Java中有一个缓存,而FileChannel没有。

但是,FileChannel确实具有OS级缓存。其中.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 }

如果您想了解更多有关OS在此级别的工作方式的信息,请阅读this blog

关于java - FileChannel#force和缓冲,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4742543/

10-12 00:37