FileChannel用于連接文件的,用來從文件里面讀取數(shù)據(jù)或者寫數(shù)據(jù)到文件里面。這個類是可以替代以前的IO的讀取文件的方式的。
FileChannel是不能被設(shè)置成非阻塞模式的,它是阻塞的。
打開FileChannel
使用FileChannel必須打開它。你可以通過InputStream、OutputStream或者RandomAccessFile來獲得FileChannel對象,下面是RandomAccessFile的列子
RandomAccessFile aFile? ? = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel? ? ? inChannel = aFile.getChannel();
從FileChannel中讀取數(shù)據(jù)

read方法會返回寫了多少個bytes到buffer里面,如果返回為1,代表已經(jīng)到文件末尾了
寫數(shù)據(jù)到FileChannel

關(guān)閉FileChannel
用完FileChannel后必須將其關(guān)閉。
channel.close();
FileChannel的position方法
有時可能需要在FileChannel的某個特定位置進(jìn)行數(shù)據(jù)的讀/寫操作??梢酝ㄟ^調(diào)用position()方法獲取FileChannel的當(dāng)前位置。
也可以通過調(diào)用position(long pos)方法設(shè)置FileChannel的當(dāng)前位置。
這里有兩個例子:
long pos = channel.position();
channel.position(pos +123);
如果將位置設(shè)置在文件結(jié)束符之后,然后試圖從文件通道中讀取數(shù)據(jù),讀方法將返回-1 作為文件結(jié)束標(biāo)志。
如果將位置設(shè)置在文件結(jié)束符之后,然后向通道中寫數(shù)據(jù),文件將撐大到當(dāng)前位置并寫入數(shù)據(jù)。這可能導(dǎo)致“文件空洞”,磁盤上物理文件中寫入的數(shù)據(jù)間有空隙。
FileChannel的size方法
FileChannel實例的size()方法將返回該實例所關(guān)聯(lián)文件的大小。如:
1longfileSize = channel.size();
FileChannel的truncate方法
可以使用FileChannel.truncate()方法截取一個文件。截取文件時,文件將中指定長度后面的部分將被刪除。
1channel.truncate(1024);
這個例子截取文件的前1024個字節(jié)。
FileChannel的force方法
FileChannel.force()方法將通道里尚未寫入磁盤的數(shù)據(jù)強(qiáng)制寫到磁盤上。出于性能方面的考慮,操作系統(tǒng)會將數(shù)據(jù)緩存在內(nèi)存中,所以無法保證寫入到FileChannel里的數(shù)據(jù)一定會即時寫到磁盤上。要保證這一點,需要調(diào)用force()方法。
force()方法有一個boolean類型的參數(shù),指明是否同時將文件元數(shù)據(jù)(權(quán)限信息等)寫到磁盤上。
下面的例子同時將文件數(shù)據(jù)和元數(shù)據(jù)強(qiáng)制寫到磁盤上:
channel.force(true);