Java NIO学习笔记一(IO VS NIO)

IO简单回忆

Java IO中最为核心的一个概念是流(Steam),面向流的编程。流是信息的载体。IO中的一个流要么是输入流,要么是输出流,不可能同时是输入流和输出流。

NIO概述

Java NIO 由以下几个核心部分组成:

  • Channel 通道
  • Buffer 缓冲区
  • Selector 选择器

在NIO中,我们是面向缓冲区(Buffer)编程的。其中Channel对应IO的Stream,Selector是因为NIO可以使用异步的非堵塞模式才加入的东西。

Channel 和 Buffer

基本上,所有的 IO 在NIO 中都从一个Channel 开始。数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。所有数据的读写都是通过Buffer进行的,永远不会出现直接向Channel写入数据的情况,或是直接从Channel读取数据的情况。Buffer的这种实现靠自带方法flip()。 这里有个图示:

这里写图片描述

Channel可以理解为IO中的Stream,与Stream不同的是Channel是双向的,一个流只可能是InputStream或是OutputStream。Channel打开则可以进行读取,写入或读写。由于是Channel是双向的,因此,他能更好地反映出底层操作系统的真实情况;在Linux系统中,底层操作系统的通道就是双向的。

Buffer本身就是一块内存,底层实现上,实际就是一个数组,数组的读写都是通过Buffer来实现的,==Buffer既可以用来读和写,与IO中的Stream不一样。==

Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel
    正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。

以下是Java NIO里关键的Buffer实现(7种原生数据类型都有各自对应的Buffer类型):

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。

Selector

Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。

这是在一个单线程中使用一个Selector处理3个Channel的图示:

这里写图片描述

一个线程对应一个Selector,这个Selector对应3个Channel,每一个Channel下面对应一个Buffer。这个线程可以在3个Channel上来回切换,具体某一个时刻线程切换到哪是由事件决定的

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值