Java NIO係列教程(七) FileChannel
Java NIO中的FileChannel是一個連接到文件的通道。可以通過文件通道讀寫文件。
FileChannel無法設置為非阻塞模式,它總是運行在阻塞模式下。
打開FileChannel
在使用FileChannel之前,必須先打開它。但是,我們無法直接打開一個FileChannel,需要通過使用一個InputStream、 OutputStream或RandomAccessFile來獲取一個FileChannel實例。下麵是通過RandomAccessFile打開 FileChannel的示例:
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel();
從FileChannel讀取數據
調用多個read()方法之一從FileChannel中讀取數據。如:
ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf);
首先,分配一個Buffer。從FileChannel中讀取的數據將被讀到Buffer中。
然後,調用FileChannel.read()方法。該方法將數據從FileChannel讀取到Buffer中。read()方法返回的int值表示了有多少字節被讀到了Buffer中。如果返回-1,表示到了文件末尾。
向FileChannel寫數據
使用FileChannel.write()方法向FileChannel寫數據,該方法的參數是一個Buffer。如:
String newData = "New String to write to file..." + System.currentTimeMillis(); ByteBuffer buf = ByteBuffer.allocate(48); buf.clear(); buf.put(newData.getBytes()); buf.flip(); while(buf.hasRemaining()) { channel.write(buf); }
注意FileChannel.write()是在while循環中調用的。因為無法保證write()方法一次能向FileChannel寫入多少字節,因此需要重複調用write()方法,直到Buffer中已經沒有尚未寫入通道的字節。
關閉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()方法將返回該實例所關聯文件的大小。如:
long fileSize = channel.size();
FileChannel的truncate方法
可以使用FileChannel.truncate()方法截取一個文件。截取文件時,文件將中指定長度後麵的部分將被刪除。如:
channel.truncate(1024);
這個例子截取文件的前1024個字節。
FileChannel的force方法
FileChannel.force()方法將通道裏尚未寫入磁盤的數據強製寫到磁盤上。出於性能方麵的考慮,操作係統會將數據緩存在內存中,所以無法保證寫入到FileChannel裏的數據一定會即時寫到磁盤上。要保證這一點,需要調用force()方法。
force()方法有一個boolean類型的參數,指明是否同時將文件元數據(權限信息等)寫到磁盤上。
下麵的例子同時將文件數據和元數據強製寫到磁盤上:
channel.force(true);
文章轉自 並發編程網-ifeve.com
最後更新:2017-05-22 17:01:35