java filechannel 空_FileChannel的基本操作
這節課,我介紹一下FileChannel的基本操作。
FileChannel既簡單,也不重要,只是它作為Java NIO的一部分,花一點時間去看看總是沒有壞處的。
Java NIO中的FileChannel是一個連接到文件的通道。可以通過文件通道讀寫文件。FileChannel無法設置為非阻塞模式,它總是運行在阻塞模式下。
在使用FileChannel之前,必須先打開它。但是,我們只能通過使用一個InputStream、OutputStream或RandomAccessFile來獲取一個FileChannel實例:
RandomAccessFile f = new RandomAccessFile("hehe.txt");
f.getChannel();
// 或者這樣: FileInputStream fin = new FileInputStream("hehe.txt");
fin.getChannel();
讀寫Channel
讀寫Channel的操作與其他的channel沒有什么區別,簡單演示一下。下面的例子展示了一個從文件A中讀取內容,并且寫到B中的操作:
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
channelA.read(buf);
buf.flip();
while(buf.hasRemaining()) {
channelB.write(buf);
}
其他操作
1、用完FileChannel后關閉。
public final void close()
2、有時可能需要在FileChannel的某個特定位置進行數據的讀/寫操作。可以通過調用position()方法獲取FileChannel的當前位置。也可以通過調用position(long pos)方法設置FileChannel的當前位置。例如:
long pos = channel.position();
channel.position(pos + 100);
如果將位置設置在文件結束符之后,然后試圖從文件通道中讀取數據,讀方法將返回-1,這代表了文件結束。
如果將位置設置在文件結束符之后,然后向通道中寫數據,文件將撐大到當前位置并寫入數據,這可能導致“文件空洞”,磁盤上物理文件中寫入的數據間有空隙,撐大的那一部分會以0填充,但卻不占用實際的磁盤空間。
3、FileChannel實例的size()方法將返回該實例所關聯文件的大小。使用size()方法。
4、截取一個文件。截取文件時,文件將中指定長度后面的部分將被刪除。如:
channel.truncate(1024);
這個例子截取文件的前1024個字節。
5、將通道里尚未寫入磁盤的數據強制寫到磁盤上。出于性能方面的考慮,操作系統會將數據緩存在內存中,所以無法保證寫入到FileChannel里的數據一定會即時寫到磁盤上。要保證這一點,需要調用force()方法。
force()方法有一個boolean類型的參數,指明是否同時將文件元數據(權限信息等)寫到磁盤上。下面的例子同時將文件數據和元數據強制寫到磁盤上:
channel.force(true);
好了。今天就講這些吧。很簡單,大家掃一眼就行了。
文件空洞這事,想深入研究的可以去研究一下,這牽扯到文件系統的具體實現。實際應用中不要這么干,沒有任何好處。
總結
以上是生活随笔為你收集整理的java filechannel 空_FileChannel的基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java form action 参数_
- 下一篇: java 加法 溢出_java实现两个大