簡體   English   中英

java.io 和文件系統塊大小

[英]java.io and file system block size

假設文件系統塊大小為 4KB,根據我的理解,這意味着所有 IO 的大小都是 4KB。 我有兩個問題:

  1. When using java.io API, say FileReader, it doesn't read one char each time, instead, it reads 4KB each time into memory. 這樣對嗎?
  2. 如果上述情況屬實,那么在使用 BufferedReader 之類的東西時將緩沖區大小設置為小於 4KB 是沒有意義的,對吧? 因為至少我們每次都會將 4KB 提取到 memory 中。

謝謝你。

要回答您的第一個問題:否。它將磁盤塊的大小讀入kernel memory。 Java(以及以任何語言編寫的程序)無權訪問該 memory。 當您進行原始讀取時,無法保證系統讀取的塊保留在 memory 中,或者以隨后訪問成本不高的方式輕松訪問。 這是一個可能的場景:

程序:“我需要這個文件中的一個字節。”
操作系統:“從文件加載 4KB 塊。 這是你請求的那個塊的字節。”
程序:“謝謝。 我不再需要那個街區了。”
操作系統:“好的。 釋放(或擱置)4KB 塊,因為不再需要它。”

程序:“我的循環需要這個文件中的另一個字節。”
操作系統:“從文件加載 4KB 塊。 這是你請求的那個塊的字節。”
程序:“謝謝。 我不再需要那個街區了。”
操作系統:“好的。 釋放(或擱置)4KB 塊,因為不再需要它。”

等等

當然,我把事情過於簡單化了。 操作系統可能會緩存它已讀取的塊。 但你無法知道持續多久。 也許是幾毫秒,也許是幾分鍾,也許根本不是。

這不僅僅是 Java 中的考慮因素。 C 長期以來一直具有單獨的read(2)fread(3)函數。

另請參閱: 何時以及為什么使用緩沖輸入和 output 流?

暫無
暫無

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

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