1. 程式人生 > >使用NIO來操作檔案

使用NIO來操作檔案

JAVANIO主要用於對檔案的讀寫操作,效率也比普通IO要高一些。在對檔案的操作中,不但支援Byte格式的操作,還支援整數,浮點等基本型別的操作,非常方便。在對大檔案的操作中,其特有的檔案對映概念可以不用將整個檔案都讀入記憶體,就能夠對檔案的任意位置進行讀寫,非常的棒。下面我們就來簡單的看一下如何使用NIO來操作檔案。

NIO對檔案的理解與普通IO不同,它將檔案抽象為一個通道,也就是FileChannel,而不是流。程式設計師不能直接與FileChannel打交道,需要通過一個稱之為緩衝器的東西,也就是ByteBuffer來對通道進行讀寫。換句話說,通道和緩衝器是NIO中兩個非常重要的概念,正確的理解這兩個概念對學習使用

NIO是非常重要的。用《JAVA程式設計思想》裡面的話來講,通道就好像煤礦,所有的資源都蘊藏在通道中,而程式設計師是煤礦老闆(注意哈,不是礦工,是老闆),老闆肯定不是親自下去挖煤,而是通過礦工推著小車把煤弄上來。礦工的死活老闆是不關心的,老闆只關心車裡的煤。而緩衝器就是車,所以你只需要和緩衝器打交道就行了,需要什麼東西就找緩衝器要,想扔掉什麼東西就往緩衝器裡面扔。當然,對於煤礦你也是要關心一下的,因為煤礦很大,選擇一個恰當的挖煤的地點也是很重要的。下面就來看一下NIO的一些經典應用:

1、順序寫入文字檔案:

//構造一個檔案通道

FileChannel fc1 = new FileOutputStream("d://aa.txt").getChannel();

//使用wrap方法構造一個臨時緩衝器,專門用來儲存字串

fc1.write(ByteBuffer.wrap("hello world".getBytes()));

//不要忘記關閉檔案

fc1.close();

2、隨機寫入基本資料,如整數:

//構造隨機訪問的檔案通道

FileChannel fc2 = new RandomAccessFile("d://bb.txt", "rw").getChannel();

//構造緩衝器,需要指定大小,單位為Byte

ByteBuffer bb = ByteBuffer.allocate(1024);

//向緩衝器第4個位元組處寫入整數,若省略位置引數則表示0

bb.putInt(4, 65);

//將緩衝器的limit設定為實際大小,pos設為0,對緩衝器寫入操作結束後,必呼叫此方法。

bb.flip();

//將緩衝器的內容寫入到通道的偏移量為8的位置。

fc2.write(bb, 8);

//關閉通道

fc2.close();

3、隨機讀入基本資料:

FileChannel fc3 = new RandomAccessFile("d://bb.txt", "rw").getChannel();

ByteBuffer bb1 = ByteBuffer.allocate(1024);

fc3.read(bb1);

//再強調一遍,凡是對緩衝器進行了寫操作後,必呼叫此方法。

bb1.flip();

int x = bb1.getInt();

System.out.println(x);

4、使用檢視緩衝器:

就不詳細說了,只說說注意事項,對檢視緩衝器資料的修改,直接等價於對ByteBuffer的修改;但是,對檢視緩衝器poslimit資訊的修改,不會影響到ByteBufferposlimit,非常有必要手動設定ByteBufferposlimit

5、儲存器對映檔案:

//連通道都省了,直接建立一個對映緩衝器,與檔案的對映關係可以通過引數來設定。之後對這個緩衝器的任何操作都等同於對檔案的操作,操作方法同上,真是方便啊!!!!

MappedByteBuffer out = new RandomAccessFile("d://bb.txt", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 0xffffff);