簡體   English   中英

FileChannel#強制和緩沖

[英]FileChannel#force and buffering

我想說清楚,並立即在FileOutputStream和FileChannel之間繪制一些相似之處。

首先, 使用標准Java io編寫文件的最有效方法似乎是使用包含BufferedOutputStream的FileOutputStream 因為它會在內部緩沖區溢出時自動刷新。 能夠進行單次寫入(單字節,浮點數等)以及數組寫入並且不擔心速度是很方便的。 你唯一不應該忘記的是關閉它(進行最后的沖洗)。 使用BufferedOutputStream包裝器的好處很明顯,每個人都必須擁有 (我希望)。

現在關於FileChannel。 FileChannel有force方法,它相當於FileOutputStream中的flush,不是嗎? 並且javadocs清楚地說,您應該使用它來確保您對目標文件進行了更改。 但是,如果沒有“BufferedFileChannel”包裝器,我不明白何時以及為什么要使用它。 換句話說,FileChannel的緩沖在哪里? 它是自動的並隱藏在FileChannel本身,就像在BufferedOutputStream中一樣嗎? 如果沒有,那么為什么我需要強制方法,因為沒有什么可以強制的(所有更改都已經在使用write方法后應用於文件)並且我必須自己實現緩沖嗎?

BufferedOutputStream 在java中有一個緩存, 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 }

如果您想了解操作系統在此級別中的工作原理,請閱讀此博客

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM