当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > Java中的新IO—NIO

Java中的新IO—NIO 时间:2018-09-26      来源:未知

一、新IO概述:

新IO和传统IO都是用于进行输入/输出,相比于传统IO面向流的处理方式,新IO采用内存映射文件来处理输入/输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了,所以这种访问方式既方便又快得多。

新IO中的两个核心对象:Channel(通道)和Buffer(缓冲)。Channel用于新IO的数据传输,相对于传统IO中的InputStream和OutputStream,Channel提供了一个map()方法用来将一段数据映射成为一块内存。也就是在新IO中,改变了传统IO面向流的处理而转向面向块的处理方式。

Buffer是一个容器,它的本质是一个数组。发送到Channel的所有对象以及从Channel取出的所有数据先存放到Buffer中。

除了上面两个核心对象外,新IO还提供了Charset类用于将Unicode字符串映射成字节序列以及逆映射操作。以及Selector类用于支持非阻塞式输入输出。

二、Java中与新IO相关的包:

1.java.nio包:主要包含各种与Buffer相关的类

2.java.nio.channels包:主要包含与Channel和Selector相关的类

3.java.nio.charset包:主要包含与字符集相关的类

4.java.nio.channels.spi包:主要包含与Channel相关的服务提供者编程接口。

5.java.nio.charset.spi包:包含与字符集相关的服务提供者编程接口

三、Channel介绍以及使用

Channel可以直接将指定文件的部分或全部直接映射成Buffer,并且程序不能直接访问Channel中的数据,Channel只能与Buffer交互。

Channel接口提供了DatagramChannel、FIleChannel、SocketChannel、ServerSocketChannel等实现类。由此可见Channel是按功能进行了划分。

Channel所有的对象都不是通过构造器创建的,而是通过传统节点InputStream和OutputStream的getChannel()方法获得的。但是不同的节点获得的Channel对象也不同,是各自节点类型对应的Channel对象。例如:FileInputStream通过getChannel获得的Channel对象是FileChannel对象。

虽然Channel对象既可以读取也可以写入,但是InputStream获得的Channel只能读,OutputStream获得Channel对象只能写。

Channel中常用的方法:map()、read()、write(),read()和write()方法有一系列的重载形式,这些方法用于从Buffer中读或写数据。

四、Buffer的介绍及使用

Buffer可以保存多个类型相同的数据。Buffer是一个抽象类,常用的子类是ByteBuffer,它可以在底层字节数组上进行get/set操作。另外还有其他的子类:CharBuffer、ShortBuffer、IntBuffer等。

Buffer中有三个重要的概念:容量(capacity)、界限(limit)、和位置(position)。

容量:缓冲区的容量,即多可以存储多少数据,其中缓冲区的容量不可以为负数,创建后不容许改变。

界限:第一个不应该被读出或者写入的缓冲区位置索引,也就是以此为界限后面的区域无法读写数据。

位置:指明下一个可以被读出或者写入的缓冲区位置索引。

put()方法和get()用于放入、取出数据。

flip()方法,调用该方法后界限就回到原来的position所在位置。

clear()方法,将position设置为0。将limit设为与capacity相等。

五、字符集和Charset

所有的文件底层都是二进制文件,即全部都是字节码。把明文的字符转换成二进制序列称为编码,把二进制编码转换成明文字符串称为解码。JDK1.4之后提供了Charset类来处理字节序列和字符序列之间的转换关系,该类中包含用于解码和编码的方法。其中该类提供的availableCharset()方法来获取当前JDK所支持的所有字符集。

每个字符集都有一个字符串别名:

GBK:简体中文字符集

BIG5:繁体中文字符集

ISO-8859-1:ISO拉丁字母表

UTF-8:8位UCS转换格式

UTF-16BE:16位UCS转换格式,大端字节顺序

UTF-16LE:16位UCS转换格式,小端字节顺序

UTF-16:16位UCS转换格式,字节顺序由可选的字节顺序标记来标识

当知道了字符集的别名之后,程序就可以调用Charset的forName()方法来创建Charset对象,然后通过创建的对象的newDecoder()、newEncoder()方法分别返回CharsetDecoder、CharsetEncoder对象代表Charset的解码器和编码器。调用CharsetDecoder的Decode()方法将字节序列转换成字符序列,调用CharsetEncoder的encode()方法可以将字符序列转化成字节序列。

上一篇:消息队列

下一篇:Xml文件约束规则使用详解

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部