Java NIO 的Channels和流(stream)很像,但是有如下區(qū)別:
- Channels既能讀又能寫,Stream只能讀或者寫
- Channels能異步讀寫
- Channels只能讀到Buffer中,或者從Buffer寫入
Channel實(shí)例
以下是Java NIO中重要的的Channel實(shí)例:
- FileChannel:從/往文件中讀/寫
- DatagramChannel:通過(guò)UDP讀寫網(wǎng)絡(luò)數(shù)據(jù)
- SocketChannel:通過(guò)TCP讀寫網(wǎng)絡(luò)數(shù)據(jù)
- ServerSocketChannel:監(jiān)聽接入的TCP連接,就像web服務(wù)器那樣。對(duì)于每個(gè)接入進(jìn)來(lái)的TCP連接都創(chuàng)建一個(gè)SocketChannel
基礎(chǔ)Channel例子
以下是一個(gè)例子,通過(guò)FileChannel往Buffer中讀一些數(shù)據(jù):
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);
文件nio-data.txt:
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
輸出結(jié)果為:
Read 48
1234567890
1234567890
1234567890
1234567890
1234Read 17
567890
1234567890