? ?Java NIO 的Channel與Stream類似,除了有以下幾點(diǎn)不同之外:
你既可以寫入Channel中也可以從Channel中讀取數(shù)據(jù),而Stream中呀洲,你只能讀取或者寫入
Channel可以異步地進(jìn)行讀寫操作
Channel總是讀取或者寫入Buffer中的數(shù)據(jù)
? ?正如上面所述逃片,數(shù)據(jù)是從一個(gè)Channel讀取到一個(gè)Buffer中蹄胰,從Buffer寫入到Channel中斩例,下面是一個(gè)例子:
Channel 的實(shí)現(xiàn)
在Java NIO中有很多重要的Channel實(shí)現(xiàn):
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
FileChannel是從文件中讀寫數(shù)據(jù)
DatagramChannel是通過UDP讀寫網(wǎng)絡(luò)數(shù)據(jù)
SocketChannel是通過TCP讀寫網(wǎng)絡(luò)數(shù)據(jù)
ServerSocketChannel允許你監(jiān)聽即將到來的TCP鏈接窄赋,如web服務(wù)器一般赡勘,每個(gè)到來的鏈接將創(chuàng)建一個(gè)SocketChannel嫂便。
基礎(chǔ)的Channel例子:
? ?下面是一個(gè)使用FileChannel讀取數(shù)據(jù)并寫入到一個(gè)Buffer的基礎(chǔ)例子:
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
? ?注意buf.flip()的調(diào)用,首先讀取數(shù)據(jù)到一個(gè)Buffer中闸与,然后翻轉(zhuǎn)這些數(shù)據(jù)毙替,然后將數(shù)據(jù)讀出。下一章節(jié)我們將結(jié)合Buffer更加詳細(xì)的講解這些