java nio channel理论总结

目录

通道的简介

DMA

通道与DMA的区别

通道的实现类

FileChannel

SocketChannel

ServerSocketChannel

DatagramChannel

通道的功能

通道的获取

通道间传输

分散/聚集

FileChannel的常用方法


通道的简介

Java NIO的Channel通道类,代表IO源与目标的连接,功能类似流,但又有些不同:

既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。

通道可以异步地读写。

通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

DMA

早期的IO由CPU负责,由于CPU与物理磁盘之间存在巨大的运算与传输速率差距,导致CPU利用率不高。

于是有了DMA来单独处理IO部分。

一个设备接口试图通过总线直接向外部设备(磁盘)传送数据时,它会先向CPU发送DMA请求信号。

外部设备(磁盘)通过DMA的一种专门接口电路――DMA控制器(DMAC),

向CPU提出接管总线控制权的总线请求,

CPU收到该信号后,在当前的总线周期结束后,会按DMA信号的优先级和提出DMA请求的先后顺序响应DMA信号。

CPU对某个设备接口响应DMA请求时,会让出总线控制权。

于是在DMA控制器的管理下,磁盘和存储器直接进行数据交换,而不需CPU干预。

数据传送完毕后,设备接口会向CPU发送DMA结束信号,交还总线控制权。

通道与DMA的区别

但是当应用程序有大量的IO请求时,又会造成总线冲突的问题,于是将DMA更新成了通道的方式。

通道与DMA的区别在于,当有IO操作时,DMA需要向CPU请求获取总线的控制权,进行IO操作,然后将总线的控制权归还CPU;

通道则是一个完全独立的处理器,无需向CPU申请总线的控制权,专门用于IO操作。

通道在DMA的基础上增加了能执行有限通道指令的I/O控制器,代替CPU管理控制外设

通道有自己的指令系统,是一个协处理器,他实质是一台能够执行有限的输入输出指令,并且有专门通讯传输的通道总线完成控制。

通道的实现类

FileChannel

FileChannel 是操作文件的Channel, 我们可以通过 FileChannel 从一个文件中读取数据, 也可以将数据写入到文件中.

注意, FileChannel 不能设置为非阻塞模式。

SocketChannel

SocketChannel 是一个客户端用来进行 TCP 连接的 Channel.

创建一个 SocketChannel 的方法有两种

打开一个 SocketChannel, 然后将其连接到某个服务器中

当一个 ServerSocketChannel 接受到连接请求时, 会返回一个 SocketChannel 对象.

ServerSocketChannel

ServerSocketChannel 顾名思义, 是用在服务器为端的, 可以监听客户端的 TCP 连接,对每一个进来的连接,都会创建一个SocketChannel

DatagramChannel

DatagramChannel 是用来处理 UDP 连接的.

通道的功能

通道的获取

1.获取通道的一种方式是对支持通道的对象调用getChannel ()方法。

支持通道的类如下:

本地IO:

FileInputStream/FileOutputStream/RandomAccessFile

网络:

DatagramSocket/Socket/ServerSocket

2.获取通道的其他方式是使用Files类的静态方法newByteChannel()获取字节通道。

3.或者通过各个通道的静态方法open()打开并返回指定通道。

4 Channles工具类中提供了静态方法newChannel()。

通道间传输

如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel。

FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中

transferTo()方法将数据从FileChannel传输到其他的channel中。下面是一个简单的例子:

分散/聚集

Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel中读取或者写入到Channel的操作。

分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。

聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。

scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。

其实就是channel.read(bufferArray)  或者  channel.write(bufferArray)

bufferArray是一个Buffer数组

FileChannel的常用方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值