没有合适的资源?快使用搜索试试~ 我知道了~
Java NIO系列教程 Java NIO Channel Buffer Selector SocketChannel
资源推荐
资源详情
资源评论
hp://ifeve.com/java-nio-all/
hp://tutorials.jenkov.com/java-nio/index.html
Java NIO 系列教程
Java NIO(New IO)是一个可以替代标准 Java IO API 的 IO API(从 Java 1.4 开始),Java NIO 提供
了与标准 IO 不同的 IO 工作方式。
Java NIO: Channels and Buffers(通道和缓冲区)
标准的 IO 基于字节流和字符流进行操作的,而 NIO 是基于通道(Channel)和缓冲区(Buffer)进
行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
Java NIO: Non-blocking IO(非阻塞 IO)
Java NIO 可以让你非阻塞的使用 IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行
其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
Java NIO: Selectors(选择器)
Java NIO 引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。
因此,单个的线程可以监听多个数据通道。
下面是 Java NIO 系列文章的目录:
1. Java NIO
概述
2. Java NIO Channel
3. Java NIO Buffer
4. Java NIO Scatter / Gather
5. Java NIO 通道之间的数据传输
6. Java NIO Selector
7. Java NIO FileChannel
8. Java NIO SocketChannel
9. Java NIO ServerSocketChannel
10. Java NIO DataGramChannel
11. Java NIO Pipe
12. Java NIO 与
IO
Java NIO 系列教程(一) Java NIO 概述
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 还有个 MappedByteBuffer,用于表示内存映射文件, 我也不打算在概述中说明。
Selector
Selector 允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流
量都很低,使用 Selector 就会很方便。例如,在一个聊天服务器中。
这是在一个单线程中使用一个 Selector 处理 3 个 Channel 的图示:
要使用 Selector,得向 Selector 注册 Channel,然后调用它的 select()方法。这个方法会一直阻塞到
某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连
接进来,数据接收等。
Java NIO 系列教程(二) Channel
Java NIO 的通道类似流,但又有些不同:
既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
通道可以异步地读写。
通道中的数据总是要先读到一个 Buffer,或者总是要从一个 Buffer 中写入。
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:
Channel 的实现
这些是 Java NIO 中最重要的通道的实现:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
FileChannel 从文件中读写数据。
DatagramChannel 能通过 UDP 读写网络中的数据。
SocketChannel 能通过 TCP 读写网络中的数据。
ServerSocketChannel 可以监听新进来的 TCP 连接,像 Web 服务器那样。对每一个新进来的连接
都会创建一个 SocketChannel。
基本的 Channel 示例
下面是一个使用 FileChannel 读取数据到 Buffer 中的示例:
!"#!$ !"%&
# #!$
# '()
* !+,#
#!$-+
#!$)
* !+#!$
.
#!$
# #!$
.
注意 buf.flip() 的调用,首先读取数据到 Buffer,然后反转 Buffer,接着再从 Buffer 中读取数据。下一
节会深入讲解 Buffer 的更多细节。
Java NIO 系列教程(三) Buffer
Java NIO 中的 Buffer 用于和 NIO 通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写
入到通道中的。
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成 NIO Buffer
对象,并提供了一组方法,用来方便的访问该块内存。
下面是 NIO Buffer 相关的话题列表:
1. Buffer
的基本用法
2. Buffer
的
capacity,position
和
limit
3. Buffer
的类型
4. Buffer
的分配
剩余35页未读,继续阅读
资源评论
wuxiaohua17
- 粉丝: 12
- 资源: 37
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功