JAVA NIO 翻譯系列(七、FileChannel)
FileChannel用於連線檔案的,用來從檔案裡面讀取資料或者寫資料到檔案裡面。這個類是可以替代以前的IO的讀取檔案的方式的。
FileChannel是不能被設定成非阻塞模式的,它是阻塞的。
開啟FileChannel
使用FileChannel必須開啟它。你可以通過InputStream、OutputStream或者RandomAccessFile來獲得FileChannel物件,下面是RandomAccessFile的列子
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
從FileChannel中讀取資料
read方法會返回寫了多少個bytes到buffer裡面,如果返回為1,代表已經到檔案末尾了
寫資料到FileChannel
關閉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()方法將返回該例項所關聯檔案的大小。如:
1longfileSize = channel.size();
FileChannel的truncate方法
可以使用FileChannel.truncate()方法擷取一個檔案。擷取檔案時,檔案將中指定長度後面的部分將被刪除。
1channel.truncate(1024);
這個例子擷取檔案的前1024個位元組。
FileChannel的force方法
FileChannel.force()方法將通道里尚未寫入磁碟的資料強制寫到磁碟上。出於效能方面的考慮,作業系統會將資料快取在記憶體中,所以無法保證寫入到FileChannel裡的資料一定會即時寫到磁碟上。要保證這一點,需要呼叫force()方法。
force()方法有一個boolean型別的引數,指明是否同時將檔案後設資料(許可權資訊等)寫到磁碟上。
下面的例子同時將檔案資料和後設資料強制寫到磁碟上:
channel.force(true);
相關文章
- Java NIO系列教程(七) FileChannelJava
- 8 Java NIO FileChannel-翻譯Java
- Java - NIO之Channel(FileChannel)Java
- 13 Java NIO 管道-翻譯Java
- 1 Java NIO概述-翻譯Java
- Java NIO 檔案通道 FileChannel 用法Java
- 16 Java NIO Files-翻譯Java
- 15 Java NIO Path-翻譯Java
- 12 Java NIO DatagramChannel-翻譯Java
- 17 Java NIO AsynchronousFileChannel-翻譯Java
- 3 Java NIO Buffer-翻譯Java
- 2 Java NIO Channel-翻譯Java
- 14 Java NIO vs IO-翻譯Java
- 10 Java NIO ServerSocketChannel-翻譯JavaServer
- 9 Java NIO SocketChannel-翻譯Java
- 7 Java NIO Selector-翻譯Java
- 【譯】Java NIO 簡明教程系列之 NIO 概述Java
- 6 Java NIO Channel to Channel Transfers-翻譯Java
- 5 Java NIO Scatter 與Gather-翻譯Java
- Java NIO學習系列七:Path、Files、AsynchronousFileChannelJava
- 【譯】Java NIO 簡明教程系列之 NIO 簡介Java
- 【譯】Java NIO 簡明教程系列之 ChannelJava
- Java NIO系列2:NIO概述Java
- [Java 8 Tutorial翻譯系列]Java forEach詳解Java
- Java NIO 簡明教程系列Java
- Java NIO系列教程(二) ChannelJava
- Java NIO學習系列四:NIO和IO對比Java
- Java NIO學習系列二:ChannelJava
- Java NIO學習系列一:BufferJava
- Java NIO系列教程(六) SelectorJava
- guava翻譯系列之JoinerGuava
- guava翻譯系列之SplitterGuava
- Yurii談翻譯(七)怎樣翻譯更地道:被濫用的“被”
- Java NIO學習系列三:SelectorJava
- 轉:Java NIO系列教程(四) Scatter/GatherJava
- java 介面(翻譯自Java Tutorials)Java
- Java NIO學習系列五:I/O模型Java模型
- 圖靈成立七週年——翻譯二三事圖靈