java nio
一、相比原始I/O,nio包中主要通过下面两个方面来提高I/O操作效率:
通过Buffer和Channel来提高I/O操作的速度。
通过Selector来支持非阻塞I/O操作。
二、通道channel和缓冲区buffer的作用:
1、 Buffer:缓冲区,用来临时存放输入或输出数据。byteBuffer是将数据源的数据写入通道(channel.write(buffer)),byteBuffer缓冲器从通道读出(channel.read(buffer))。
2、 Channel:数据传输通道,用来把Buffer中的数据写入到数据源,或者把数据源中的数据读入到Buffer。channel:FileChannel(与文件操作相关,可以由FileInputStream,FileOutputStream,RandomAccessFile三个类来产生); SocketChannel、ServerSocketChannel、DatagramChannel(网络通信相关)
3、Selector:用来支持异步I/O操作,也叫非阻塞I/O操作。
三、 Buffer&Chanel
Channel 和 buffer 是 NIO 是两个最基本的数据类型抽象。
Buffer:
– 是一块连续的内存块。
– 是 NIO 数据读或写的中转地。
Channel:
– 数据的源头或者数据的目的地
– 用于向 buffer 提供数据或者读取 buffer 数据 ,buffer 对象的唯一接口。
– 异步 I/O 支持
四、buffer常见方法
flip()写模式转化为读模式,limit设置为当前位置,position设置为0。
rewind()将 position 重置为 0 ,limit值不变,一般用于重复读。
mark()、reset()前者标记读的起始节点、后者将返回到起始节点。
compact(): 将未读取的数据拷贝到 buffer 的头部位。
clear():清空 buffer ,准备再次被写入 (position 变成 0 , limit 变成 capacity) 。
五、字符编码与解码
字符编码解码 : 字节码本身只是一些数字,放到正确的上下文中被正确被解析。向 ByteBuffer 中存放数据时需要考虑字符集的编码方式,读取展示 ByteBuffer 数据时涉及对字符集解码。用到Charset字符集对象,以及CharsetDecoder解码器对象( charset.newDecoder()生成)
解码代码:
public static String getStringByBuffer(ByteBuffer buffer) throws IOException{
if(buffer == null || buffer.limit()==0)
return null;
Charset charset = Charset.forName("UTF-8");
CharsetDecoder encoder = charset.newDecoder();
CharBuffer Charbuffer = encoder.decode(buffer);
return Charbuffer.toString();
}