Java NIO的通道類似流稠曼,但又有些不同:
既可以從通道中讀取數(shù)據(jù)芥丧,又可以寫數(shù)據(jù)到通道刁绒。但流的讀寫通常是單向的闷营。
通道可以異步地讀寫。
通道中的數(shù)據(jù)總是要先讀到一個(gè)Buffer膛锭,或者總是要從一個(gè)Buffer中寫入粮坞。
正如上面所說蚊荣,從通道讀取數(shù)據(jù)到緩沖區(qū),從緩沖區(qū)寫入數(shù)據(jù)到通道莫杈。如下圖所示:
Channel的實(shí)現(xiàn)
這些是Java NIO中最重要的通道的實(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)聽新進(jìn)來(lái)的TCP連接媳叨,像Web服務(wù)器那樣。對(duì)每一個(gè)新進(jìn)來(lái)的連接都會(huì)創(chuàng)建一個(gè)SocketChannel关顷。
基本的 Channel 示例
下面是一個(gè)使用FileChannel讀取數(shù)據(jù)到Buffer中的示例:
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ù)到Buffer,然后反轉(zhuǎn)Buffer,接著再?gòu)腂uffer中讀取數(shù)據(jù)议双。下一節(jié)會(huì)深入講解Buffer的更多細(xì)節(jié)痘番。
原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自并發(fā)編程網(wǎng) – ifeve.com本文鏈接地址:Java NIO系列教程(二) Channel