首頁(yè)技術(shù)文章正文

FileChannel如何讀寫(xiě)文件?

更新時(shí)間:2023-03-27 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

獲取FileChannel不能直接打開(kāi),必須通過(guò) FileInputStream、FileOutputStream 或者 RandomAccessFile 來(lái)獲取 FileChannel,它們都有 getChannel 方法。

  通過(guò)FileInputStream獲取的channel只能讀

  通過(guò)FileOutputStream獲取的channel只能寫(xiě)

  通過(guò)RandomAccessFile是否能讀寫(xiě)根據(jù)構(gòu)造RandomAccessFile 時(shí)的讀寫(xiě)模式?jīng)Q定。

1.讀取

會(huì)從channel讀取數(shù)據(jù)填充ByteBuffer,返回值表示讀到了多少字節(jié),-1 表示到達(dá)了文件的末尾。

int readBytes = channel.read(buffer);

2.寫(xiě)入

寫(xiě)入的正確代碼如下:

ByteBuffer buffer = ...;
buffer.put(...); // 存入數(shù)據(jù)
buffer.flip();   // 切換讀模式

while(buffer.hasRemaining()) {
    channel.write(buffer);
}

在 while 中調(diào)用 channel.write 是因?yàn)?write 方法并不能保證一次將 buffer 中的內(nèi)容全部寫(xiě)入 channel

3.關(guān)閉

channel 必須關(guān)閉,不過(guò)調(diào)用了 FileInputStream、FileOutputStream 或者 RandomAccessFile 的 close 方法會(huì)間接地調(diào)用 channel 的 close 方法。

4.位置

獲取當(dāng)前位置的示例代碼如下:

long pos = channel.position();

設(shè)置當(dāng)前位置

long newPos = ...;
channel.position(newPos);

設(shè)置當(dāng)前位置時(shí),如果設(shè)置為文件的末尾會(huì)讀取會(huì)返回 -1 。這時(shí)寫(xiě)入,會(huì)追加內(nèi)容,但要注意如果 position 超過(guò)了文件末尾,再寫(xiě)入時(shí)在新內(nèi)容和原末尾之間會(huì)有空洞(00)。

5.大小

使用 size 方法獲取文件的大小

6.強(qiáng)制寫(xiě)入

操作系統(tǒng)出于性能的考慮,會(huì)將數(shù)據(jù)緩存,不是立刻寫(xiě)入磁盤(pán)??梢哉{(diào)用 force(true) 方法將文件內(nèi)容和元數(shù)據(jù)(文件的權(quán)限等信息)立刻寫(xiě)入磁盤(pán)。





分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!