首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileChannel#force与缓冲

FileChannel#force与缓冲
EN

Stack Overflow用户
提问于 2011-01-20 01:13:57
回答 1查看 5.5K关注 0票数 8

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

因此,首先,使用standart编写文件的最有效的方法似乎是使用与包装的FileOutputStream。因为当内部缓冲区溢出时,它会自动刷新。能够完成单个写操作(单字节、浮动等)是很方便的。以及数组的,而不是担心速度。唯一你永远不应该忘记的就是关闭它(执行最后的刷新)。使用BufferedOutputStream包装器的好处是显而易见的,必须为每个人提供(我希望如此)。

现在是关于FileChannel。FileChannel有force方法,它相当于FileOutputStream中的刷新,不是吗?和javadocs明确表示,您应该使用它来确保对目标文件进行了更改。但是,如果没有"BufferedFileChannel“包装,我不明白何时以及为什么要使用它。,换句话说,FileChannel的缓冲在哪里?它是否自动地隐藏在FileChannel中,就像在BufferedOutputStream中一样?如果没有,那么为什么我需要强制方法,因为没有什么需要强制的(在使用写方法之后,所有更改都已经应用到文件中了),我是否必须自己实现缓冲呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-20 02:12:38

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

然而,FileChannel确实有OS级别的缓存.其中.force()fsync / fdatasync相同。

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

代码语言:javascript
复制
  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 }

如果想更多地了解操作系统在这个级别上的工作方式,请阅读这个博客

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4742543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档