现在,我想澄清一下FileOutputStream和FileChannel之间的一些相似之处。
因此,首先,使用standart编写文件的最有效的方法似乎是使用与包装的FileOutputStream。因为当内部缓冲区溢出时,它会自动刷新。能够完成单个写操作(单字节、浮动等)是很方便的。以及数组的,而不是担心速度。唯一你永远不应该忘记的就是关闭它(执行最后的刷新)。使用BufferedOutputStream包装器的好处是显而易见的,必须为每个人提供(我希望如此)。
现在是关于FileChannel。FileChannel有force方法,它相当于FileOutputStream中的刷新,不是吗?和javadocs明确表示,您应该使用它来确保对目标文件进行了更改。但是,如果没有"BufferedFileChannel“包装,我不明白何时以及为什么要使用它。,换句话说,FileChannel的缓冲在哪里?它是否自动地隐藏在FileChannel中,就像在BufferedOutputStream中一样?如果没有,那么为什么我需要强制方法,因为没有什么需要强制的(在使用写方法之后,所有更改都已经应用到文件中了),我是否必须自己实现缓冲呢?
发布于 2011-01-20 02:12:38
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 }如果想更多地了解操作系统在这个级别上的工作方式,请阅读这个博客。
https://stackoverflow.com/questions/4742543
复制相似问题