【JAVA】【NIO】8、Java NIO FileChannel

來源:互聯網
上載者:User

標籤:java   nio   翻譯   filechanne   

Java NIO的FileChannel是串連檔案的通道。通過檔案通道,你可以從檔案讀資料,也可以將資料寫到檔案中。FileChannel類和標準Java IO API都是可用來讀檔案的。

FileChannel不能被設定成非阻塞模式。它總是運行在阻塞模式下。

開啟檔案通道

在你使用檔案通道之前必須開啟它。你不能直接開啟檔案通道。你需要通過InputStream,OutputStream或者RandomAccessFile來擷取檔案通道。如下:

RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw");FileChannel fromChannel = fromFile.getChannel();
從檔案通道讀資料

通過read方法,如下:

ByteBuffer buffer = ByteBuffer.allocate(8);int bytesRead = channel.read(buffer);

首先,分配一個Buffer,從FileChannel讀取的資料會讀到Buffer中。
其次,調用read方法,將資料讀進Buffer,方法返回的int說明有多少位元組資料寫進Buffer了。如果返回-1,說明檔案讀完了。

向檔案通道寫資料

通過write方法,如下:

RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw");FileChannel channel = fromFile.getChannel();ByteBuffer buffer = ByteBuffer.allocate(10);buffer.clear();buffer.put("Hello".getBytes());buffer.flip();while(buffer.hasRemaining()) {    channel.write(buffer);}fromFile.close();

注意write方法是在一個迴圈內被調用,不能保證有多少位元組寫到檔案通道裡了,所以我們重複調用write方法直到Buffer沒有資料了。

關閉檔案通道
channel.close();
檔案通道的position

需要對檔案通道的特定的位置讀寫,你可以通過調用position方法擷取檔案通道當前的位置。
你也可以通過調用position(long pos)方法設定檔案通道的position。如下:

long pos = channel.position();channel.position(pos+2);

如果你設定的position在檔案末尾之後,從通道讀資料會返回-1.
同樣如果是寫,檔案會增大,這可能導致檔案空洞,磁碟上的物理檔案中寫入的資料之間有空隙。

RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw");        FileChannel channel = fromFile.getChannel();        long fileSize = channel.size();        System.out.println("====="+fileSize);        long pos = channel.position();        System.out.println("Current Position: " + pos);        //重新設定位置        channel.position(pos+3);//形成檔案空洞        ByteBuffer buffer = ByteBuffer.allocate(10);        buffer.clear();        buffer.put("a".getBytes());        buffer.flip();        while(buffer.hasRemaining()) {//寫檔案            channel.write(buffer);        }        buffer.flip();        int bytesRead = channel.read(buffer);//讀檔案        while(bytesRead!=-1) {            buffer.flip();            while(buffer.hasRemaining()) {                System.out.print((char)buffer.get());            }            System.out.println();            buffer.clear();            bytesRead = channel.read(buffer);        }        channel.close();        fromFile.close();



這個圖片中的20是空格,和上面的00不一樣,本人是想試試這個空洞本質上不是空格。



以上展示了檔案空洞。

檔案通道size

size方法返回FileChannel所關聯的檔案大小。如下:

long fileSize = channel.size();

channel.size和file.length返回的結果是一樣的,都是檔案的大小,位元組數。

檔案通道的truncate

截取檔案。當你截取檔案時,必須指定長度。如下:

channel.truncate(10);


如果給定大小小於該檔案的當前大小,則截取該檔案,丟棄檔案新末尾後面的所有位元組。如果給定大小大於等於該檔案的當前大小,則不修改檔案。無論是哪種情況,如果此通道的檔案位置大於給定大小,則將位置設定為該大小。

檔案通道的force

force方法會將channel裡未寫入磁碟的資料全部flush到磁碟。作業系統也許為了效能,會快取資料在記憶體中,所以不能保證寫入channel的資料一定會寫到磁碟上,除非你調用forece方法。
force方法有一個boolean類型的參數,表示是否將檔案中繼資料(許可權等)寫到磁碟上。如下:

channel.force(true);

下一節:等待

【JAVA】【NIO】8、Java NIO FileChannel

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.