更新時間:2023-03-27 來源:黑馬程序員 瀏覽量:
獲取FileChannel不能直接打開,必須通過 FileInputStream、FileOutputStream 或者 RandomAccessFile 來獲取 FileChannel,它們都有 getChannel 方法。
通過FileInputStream獲取的channel只能讀
通過FileOutputStream獲取的channel只能寫
通過RandomAccessFile是否能讀寫根據構造RandomAccessFile 時的讀寫模式決定。
1.讀取
會從channel讀取數據填充ByteBuffer,返回值表示讀到了多少字節,-1 表示到達了文件的末尾。
int readBytes = channel.read(buffer);
2.寫入
寫入的正確代碼如下:
ByteBuffer buffer = ...; buffer.put(...); // 存入數據 buffer.flip(); // 切換讀模式 while(buffer.hasRemaining()) { channel.write(buffer); }
在 while 中調用 channel.write 是因為 write 方法并不能保證一次將 buffer 中的內容全部寫入 channel
3.關閉
channel 必須關閉,不過調用了 FileInputStream、FileOutputStream 或者 RandomAccessFile 的 close 方法會間接地調用 channel 的 close 方法。
4.位置
獲取當前位置的示例代碼如下:
long pos = channel.position();
設置當前位置
long newPos = ...; channel.position(newPos);
設置當前位置時,如果設置為文件的末尾會讀取會返回 -1 。這時寫入,會追加內容,但要注意如果 position
超過了文件末尾,再寫入時在新內容和原末尾之間會有空洞(00)。
5.大小
使用 size 方法獲取文件的大小
6.強制寫入
操作系統出于性能的考慮,會將數據緩存,不是立刻寫入磁盤。可以調用 force(true) 方法將文件內容和元數據(文件的權限等信息)立刻寫入磁盤。