import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileCopy { public static String fff="C://Users/dell/Desktop/test.txt"; public static void main(String[] args) throws IOException { int bufSize=1024; byte[] bs=new byte[bufSize]; //分配一個新的字節緩衝區。 ByteBuffer bb = ByteBuffer.allocate(1024); //建立一個隨機訪問文件的實例,第一個參數是文件路徑,第二個參數是文件的訪問模式,r表示只讀;getChannel方法表示得到一個與此文件 //相關聯的通道對象,而通道的做用是用於讀取、寫入、映射和操做文件 FileChannel channel =new RandomAccessFile(fff, "r").getChannel(); //read方法將字節序列今後通道讀入給定的緩衝區,今後通道的當前文件位置開始讀取字節,而後根據實際讀取的字節數更新該文件位置,參數爲 //一個字節緩衝區,返回值爲讀取的字節數,可能爲0,若是是讀取到了文件的末尾,則返回爲-1. while (channel.read(bb) != -1) { //ByteBuffer能夠做爲一個緩衝區,是由於它是內存中的一段連續的空間,在ByteBuffer對象內部定義了四個索引, //分別是mark,position,limit,capacity. //mark對當前position的標記,position表示當前可讀寫的指針,若是是向ByteBuffer對象中寫入一個字節,那麼就會向 //position所指向的地址寫入這個字節;若是是從bytebuffer中讀出一個字節,那麼就會把position所指向的地址所在數據 //讀出,讀寫完成以後,position的位置會加1. //flip方法將limit的值置爲position的值,而把position置爲0,在byteBuffer剛剛建立的時候,limit的 //值和容量的值是一致的,position的初始值爲0,當讀取了內容以後,position的位置爲新讀取內容的最後一個字節的位置。 //bb.flip(); int size = bb.position(); bb.rewind();//這個方法將position索引置爲0,mark索引置爲-1 bb.get(bs); // 把文件當字符串處理,直接打印作爲一個例子。 System.out.print(new String(bs, 0, size)); bb.clear();//clear方法並無將bytebuffer中的內容清空,它只是將postion設置爲0,將limit設置爲初始容量大小 //這樣再往緩存中添加元素的時候,就會用新的元素來覆蓋舊的元素,這樣在最後一次讀取流中的數據的時候,此緩衝區中的前面一段是新的內容 //然後面是舊的內容,以position爲分界點。因此再輸出緩衝區數據的時候須要小心將舊的內容再輸出一次。 //解決辦法有兩種:一種是本例中的所使用的,每次都獲得position的位置,以此爲界限輸出position以前的內容; //第二種是使用bb.compact(),這個方法的做用是,將byteBuffer中的沒有讀取完的數據剪切到byteBuffer中 //的最前面。 } } }