java NIO的Channel(通道)类似于流,但又与流不同:
1.通道即可以读取数据,也可以写入数据,但流的读写通常是分开的。
2.通道可以异步的读写。
3.通道中的数据总是先读到一个Buffer,或者从一个Buffer中写入。
正如上所说,Channel与Buffer之间进行互相的写入和写出。
Channel的主要实现:
1.FileChannel:从文件中读写数据。
2.DatagramChannel:通过UDP读写网络中的数据
3.SocketChannel:通过TCP读写网络中的数据
4.ServerSocketChannel:可以监听新进来的TCP连接
Demo:
package com.vgbh;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class ChannelDemo {
public static void main(String[] args) {
new ChannelDemo().readFromChannelFile();
}
public void readFromChannelFile () {
try {
RandomAccessFile file = new RandomAccessFile("F:/WorkSpace/TestBook.txt", "rw");//IO的获取文件类
FileChannel fileChannel = file.getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);//创建一个Buffer,状态为写入状态
int byteReads = fileChannel.read(buf);//当前buf中的数据长度
while (byteReads != -1) {
System.out.println("ssss " + byteReads + " ssss");
buf.flip();//反转Buffer,将写入状态转换为写出状态
while (buf.hasRemaining()) {
System.out.println((char)buf.get());//获取buf中的数据,将int转换为char,在buf写完后会自动转换为写入状态
}
buf.clear();//将Buffer清空,以便下次写入
byteReads = fileChannel.read(buf);//重新写入新的数据
}
file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上边的只是FileChannel,还有DatagramChannel、SocketChannel、ServerSocketCHannel这些都跟IO中的类似,有兴趣的可以自己尝试以下,尝试过后你会感觉到NIO比IO好用了很多,没有IO的那种零散的感觉。
有问题的联系问我的邮箱。