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();
}


posted @ 2014-10-09 10:52  飞扬的薰衣草  阅读(122)  评论(0编辑  收藏  举报