簡體   English   中英

何時使用 FileChannel 讀取()/寫入()文件?

[英]When Use FileChannel to read()/write() files?

我正在閱讀Thinking in Java這本書它解釋了java.nio.*包並說 NIO 比使用傳統 IO 流讀取和寫入文件更快。 為什么?

我查看了以下信息:

  • IO流是面向字節的,傳統IO處理單元是字節,而NIO處理單元是塊(字節數組),但是我覺得傳統IO也可以通過BufferedFile*直接處理塊(字節數組),而傳統IO也有直接的方法處理字節數組

    private native int readBytes(byte b[], int off, int len) throws IOException;
  • IO是阻塞讀,NIO可以是非阻塞的,但是我發現文件NIO只能是非阻塞的,那么NIO就沒有優勢了。

  • 我認為需要使用NIO的一般是其他需要使用NIO的優勢,比如:

     transferTo()/transferFrom()

那么,什么時候應該使用 NIO 進行文件讀寫呢? 為什么比傳統IO快? 使用它的正確方法是什么? 我應該只在讀寫文件時使用 IO 還是 NIO?

只有兩種情況FileChannelFileInputStreamFileOutputStream快。

第一種是您可以使用堆外(“直接”) ByteBuffer來保存數據,這樣它就不會被復制到 Java 堆中。 例如,如果您正在編寫一個將靜態文件傳送到套接字的 Web 服務器,使用FileInputStreamSocketChannel而不是FileInputStreamSocketOutputStream

在我看來,這些案例很少,而且相去甚遠。 通常,當您使用 Java 讀取(或寫入)文件時,您將對數據進行處理。 在這種情況下,您無法避免將數據復制到堆上。

FileChannel的另一個用途是創建一個MappedByteBuffer以隨機訪問文件的內容。 這比使用RandomAccessFile快得多,因為它用利用操作系統分頁機制的內存訪問替換了對操作系統內核的顯式調用。

如果您剛剛開始使用 Java 中的 I/O,我建議您堅持使用java.io的類,除非您能解釋為什么切換到java.nio會提高性能。 使用面向流的抽象比使用面向塊的抽象要容易得多。

暫無
暫無

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

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