gpt4 book ai didi

java - FileChannel#force 和缓冲

转载 作者:搜寻专家 更新时间:2023-11-01 01:29:48 24 4
gpt4 key购买 nike

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

所以首先,用标准 Java io 编写文件的最有效方法似乎是使用用 BufferedOutputStream 包装的 FileOutputStream。因为它会自动刷新,当内部缓冲区溢出时。能够进行单次写入(单字节、 float 等)和数组写入很方便,而且不用担心速度。唯一你不应该忘记的是关闭它(执行最后的冲洗)。使用 BufferedOutputStream 包装器的好处是显而易见的,并且必须每个人(我希望)。

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

最佳答案

BufferedOutputStreamjava 中有一个缓存,而 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 }

阅读this blog如果您想了解更多操作系统在此级别的工作原理。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com