Java NIO 中的 FileChannel 是一個鏈接到文件的通道。能夠經過文件通道讀寫文件。java
FileChannel 沒法設置爲非阻塞模式,它老是運行在阻塞模式下。編程
在使用 FileChannel 以前,必須先打開它。可是,咱們沒法直接打開一個 FileChannel,須要經過使用一個 InputStream、OutputStream 或 RandomAccessFile 來獲取一個 FileChannel 實例。下面是經過 RandomAccessFile 打開 FileChannel 的示例:緩存
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel();
調用多個 read() 方法之一從 FileChannel 中讀取數據。如:併發
ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf);
首先,分配一個 Buffer。從 FileChannel 中讀取的數據將被讀到 Buffer 中。dom
而後,調用 FileChannel.read() 方法。該方法將數據從 FileChannel 讀取到 Buffer 中。read() 方法返回的 int 值表示了有多少字節被讀到了 Buffer 中。若是返回 -1,表示到了文件末尾。性能
使用 FileChannel.write() 方法向 FileChannel 寫數據,該方法的參數是一個 Buffer。如:操作系統
String newData = "New String to write to file..." + System.currentTimeMillis(); ByteBuffer buf = ByteBuffer.allocate(48); buf.clear(); buf.put(newData.getBytes()); buf.flip(); while(buf.hasRemaining()) { channel.write(buf); }
注意 FileChannel.write() 是在 while 循環中調用的。由於沒法保證 write() 方法一次能向 FileChannel 寫入多少字節,所以須要重複調用 write() 方法,直到 Buffer 中已經沒有還沒有寫入通道的字節。code
用完 FileChannel 後必須將其關閉。如:教程
channel.close();
有時可能須要在 FileChannel 的某個特定位置進行數據的讀/寫操做。能夠經過調用 position() 方法獲取 FileChannel 的當前位置。ip
也能夠經過調用 position(long pos) 方法設置 FileChannel 的當前位置。
這裏有兩個例子:
long pos = channel.position(); channel.position(pos +123);
若是將位置設置在文件結束符以後,而後試圖從文件通道中讀取數據,讀方法將返回 -1 —— 文件結束標誌。
若是將位置設置在文件結束符以後,而後向通道中寫數據,文件將撐大到當前位置並寫入數據。這可能致使「文件空洞」,磁盤上物理文件中寫入的數據間有空隙。
FileChannel 實例的 size() 方法將返回該實例所關聯文件的大小。如:
long fileSize = channel.size();
可使用 FileChannel.truncate() 方法截取一個文件。截取文件時,文件將中指定長度後面的部分將被刪除。如:
channel.truncate(1024);
這個例子截取文件的前 1024 個字節。
FileChannel.force() 方法將通道里還沒有寫入磁盤的數據強制寫到磁盤上。出於性能方面的考慮,操做系統會將數據緩存在內存中,因此沒法保證寫入到 FileChannel 裏的數據必定會即時寫到磁盤上。要保證這一點,須要調用 force() 方法。
force() 方法有一個 boolean 類型的參數,指明是否同時將文件元數據(權限信息等)寫到磁盤上。
下面的例子同時將文件數據和元數據強制寫到磁盤上:
channel.force(true);
轉載自併發編程網 – ifeve.com,本文連接地址: Java NIO系列教程(七) FileChannel