Channel
Buffer
Selector
Java NIO 由Channel,Buffer和Selector核心部分组成,以下主要介绍这三个组件
一.Channel(通道)
传统IO中的stream是单向的,比如InputStream只能进行读取操作;OutputStream只能进行写操作。
Channel也是类似传统IO中的stream,但是有很大的区别,Channel是双向的,可读可写,提供从文件,网络读取数据的渠道。
常用的几个通道:
~FileChannel:可以从文件读,或者向文件写入数据
~SocketChannel:以TCP来向网络连接的两端读写数据
~ServerSocketChannel:监听客户端发起的TCP连接,并为每个TCP连接创建一个新的SocketChannel来进行数据的读写
~DatagramChannel:以UDP协议来向网络连接的两端读写数据
这些通道覆盖了UDP和TCP网络IO,以及文件IO。
二.Buffer(缓冲区)
读取或者写入的数据都必须经由Buffer。数据从Buffer写到Channel,从Channel读到Buffer
Buffer是一个顶层父类,这是一个抽象类,常用的子类:
~ByteBuffer
~IntBuffer
~CharBuffer
~DoubleBuffer
~FloatBuffer
~LongBuffer
~ShortBuffer
这些Buffer覆盖了可以通过IO发送的基本数据类型:byte,short,int,long,float,double和char
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("data.txt");
FileOutputStream outputStream = new FileOutputStream(file);
FileChannel channel = outputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
String string = "java nio";
buffer.put(string.getBytes());
buffer.flip(); //此处必须要调用buffer的flip方法
channel.write(buffer);
channel.close();
outputStream.close();
}
}
上面的程序会向工程目录下面的data.txt写入字符串”java nio”
三.Selector(选择器)
Selector允许单线程处理多个Channel,使用Selector,需要向Selector注册Channel,然后调用它的select()方法。一旦发现注册的Channel有事件发生,便获取事件进行处理