- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java NIO 系列教程
Java NIO 系列教程(一) Java NIO 概述
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一
Java NIO 由以下几个核心部分组成:
Channels
Buffers
Selectors
虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API 。
其它组件,如Pipe 和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个
组件上。其它组件会在单独的章节中讲到。
Channel 和 Buffer
基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel 读到Buffer
中,也可以从Buffer 写到Channel 中。这里有个图示:
Channel 和Buffer 有好几种类型。下面是JAVA NIO 中的一些主要Channel 的实现:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。
与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。本教程其它章节与它们相关的地
方我会进行解释。
以下是Java NIO 里关键的Buffer 实现:
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
这些Buffer 覆盖了你能通过IO 发送的基本数据类型:byte, short, int, long, float, double 和 char 。
Java NIO 还有个 Mappedyteuffer,用于表示内存映射文件, 我也不打算在概述中说明。
Selector
Selector 允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用
Selector 就会很方便。例如,在一个聊天服务器中。
这是在一个单线程中使用一个Selector 处理3 个Channel 的图示:
要使用Selector,得向Selector 注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通
道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。
Java NIO 系列教程(二) Channel
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一
Java NIO 的通道类似流,但又有些不同:
既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
通道可以异步地读写。
通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer 中写入。
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:
Channel 的实现
这些是Java NIO 中最重要的通道的实现:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
FileChannel 从文件中读写数据。
DatagramChannel 能通过UDP 读写网络中的数据。
SocketChannel 能通过TCP 读写网络中的数据。
ServerSocketChannel 可以监听新进来的TCP 连接,像Web 服务器那样。对每一个新进来的连接都会创建一个
SocketChannel 。
基本的 Channel 示例
下面是一个使用FileChannel 读取数据到Buffer 中的示例:
01 RandomAccessFile aFile = new RandomAccessFile(data/nio-data.txt, rw);
02 FileChannel inChannel = aFile.getChannel();
原创力文档


文档评论(0)