JAVA NIO 翻譯系列(七、FileChannel)

weixin_33913332發表於2017-08-11

FileChannel用於連線檔案的,用來從檔案裡面讀取資料或者寫資料到檔案裡面。這個類是可以替代以前的IO的讀取檔案的方式的。

FileChannel是不能被設定成非阻塞模式的,它是阻塞的。


開啟FileChannel

使用FileChannel必須開啟它。你可以通過InputStream、OutputStream或者RandomAccessFile來獲得FileChannel物件,下面是RandomAccessFile的列子

RandomAccessFile aFile    = new RandomAccessFile("data/nio-data.txt", "rw");

FileChannel      inChannel = aFile.getChannel();


從FileChannel中讀取資料

1642079-2064e96725b7e1de.png

read方法會返回寫了多少個bytes到buffer裡面,如果返回為1,代表已經到檔案末尾了


寫資料到FileChannel

1642079-d480bccd2d9dbb7b.png

關閉FileChannel

用完FileChannel後必須將其關閉。

channel.close();

FileChannel的position方法

有時可能需要在FileChannel的某個特定位置進行資料的讀/寫操作。可以通過呼叫position()方法獲取FileChannel的當前位置。

也可以通過呼叫position(long pos)方法設定FileChannel的當前位置。

這裡有兩個例子:

long pos = channel.position();

channel.position(pos +123);

如果將位置設定在檔案結束符之後,然後試圖從檔案通道中讀取資料,讀方法將返回-1 作為檔案結束標誌。

如果將位置設定在檔案結束符之後,然後向通道中寫資料,檔案將撐大到當前位置並寫入資料。這可能導致“檔案空洞”,磁碟上物理檔案中寫入的資料間有空隙。

FileChannel的size方法

FileChannel例項的size()方法將返回該例項所關聯檔案的大小。如:

1longfileSize = channel.size();

FileChannel的truncate方法

可以使用FileChannel.truncate()方法擷取一個檔案。擷取檔案時,檔案將中指定長度後面的部分將被刪除。

1channel.truncate(1024);

這個例子擷取檔案的前1024個位元組。

FileChannel的force方法

FileChannel.force()方法將通道里尚未寫入磁碟的資料強制寫到磁碟上。出於效能方面的考慮,作業系統會將資料快取在記憶體中,所以無法保證寫入到FileChannel裡的資料一定會即時寫到磁碟上。要保證這一點,需要呼叫force()方法。

force()方法有一個boolean型別的引數,指明是否同時將檔案後設資料(許可權資訊等)寫到磁碟上。

下面的例子同時將檔案資料和後設資料強制寫到磁碟上:

channel.force(true);

相關文章