本文參考至:http://ifeve.com/channels/
其實(shí)可以將Channel理解為流幕屹,不同的地方在于:
1. Channel既可以從中讀取數(shù)據(jù)蓝角,又可以寫(xiě)數(shù)據(jù)到Channel。但流的讀寫(xiě)通常是單向的罢屈。
2. Channel可以異步地讀寫(xiě)。
3. Channel中的數(shù)據(jù)總是要先讀到一個(gè)Buffer篇亭,或者總是要從一個(gè)Buffer中寫(xiě)入缠捌。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* NIO中FileChannle的創(chuàng)建
* Channel的理解
* @2017-3-21
*/
public class FileChannleMake {
public static void main(String[] args) throws IOException {
// 獲取文件對(duì)象
File file = new File("F:/jia.txt");
// 將文件對(duì)象轉(zhuǎn)為流的形式
FileInputStream fileInput = new FileInputStream(file);
// 將輸入流轉(zhuǎn)為channel對(duì)象
FileChannel fileChannel = fileInput.getChannel();
// 用于保存從channel讀取到的數(shù)據(jù),最大容量:48bytes
ByteBuffer byteBuffer = ByteBuffer.allocate(48);
// 從文件中讀寫(xiě)數(shù)據(jù)译蒂,下面這行代碼表示從該通道讀取一個(gè)字節(jié)序列到給定的緩沖區(qū)曼月。通道是可以異步讀寫(xiě)的!H嶂纭哑芹!
// 每次從通道讀48個(gè)字節(jié)到byteBuffer中,讀過(guò)的數(shù)據(jù)不能再讀
int bytesRead = fileChannel.read(byteBuffer);
while (bytesRead != -1) {
byteBuffer.flip();
while (byteBuffer.hasRemaining()) {
System.out.print((char) byteBuffer.get());
}
System.out.println(" ----read " + bytesRead);
byteBuffer.clear();
// 當(dāng)byteBuffer全部讀出后捕透,又會(huì)繼續(xù)從channel讀數(shù)據(jù)到byteBuffer中聪姿,直到讀完channel中的數(shù)據(jù)
bytesRead = fileChannel.read(byteBuffer);
}
//通過(guò)下面的代碼,可以清晰的發(fā)現(xiàn)乙嘀。FileChannel中的數(shù)據(jù)只要讀出之后就會(huì)被刪掉
ByteBuffer byteBuffer1 = ByteBuffer.allocate(48);
int bytesRead1 = fileChannel.read(byteBuffer);
System.out.println("ssssssssss" + bytesRead1);
while (bytesRead1 != -1) {
System.out.println("ssssssssssasasas----end" + bytesRead1);
byteBuffer1.flip();
while (byteBuffer.hasRemaining()) {
System.out.print((char) byteBuffer1.get());
}
System.out.println(" ----read " + bytesRead1);
byteBuffer.clear();
bytesRead1 = fileChannel.read(byteBuffer);
}
}
}
讀者可以嘗試看看然后運(yùn)行上面的代碼末购。
這里簡(jiǎn)單介紹一下FileChannel
Java NIO中的FileChannel是一個(gè)連接到文件的通道』⑿唬可以通過(guò)文件通道讀寫(xiě)文件盟榴。在使用FileChannel之前,必須先打開(kāi)它婴噩。但是擎场,我們無(wú)法直接打開(kāi)一個(gè)FileChannel,需要通過(guò)使用一個(gè)InputStream讳推、OutputStream或RandomAccessFile來(lái)獲取一個(gè)FileChannel實(shí)例顶籽。(上面例子我是通過(guò)FileInputStream 來(lái)獲取FileChannel的)