java i o 模型简述_Java 语言实现的 I/O 模型

1.概述

1.发展历史

JDK 1.4 之前,Java 所提供的网络编程API全部采用了I/O同步阻塞模型

JDK 1.4 引入了非阻塞I/O(NIO)类库,自此Java语言可以支持多路复用I/O模型

JDK 1.7 引入了异步I/O编程类库,被称为NIO2,也叫AIO

2.Java NIO 开源网络通信框架

Mina:Apache

Grizzly:

Netty:JBoss。事件驱动模型,线程模型。TCP/UDP,HTTP协议栈、SSL/TLS、STARTTLS,Applet、Android。

2.Java Classic I/O (Blocking I/O) 介绍

2.1 Streams 字节流 & Writer 与 Reader 字符流

java.io 包提供了对字节流、字符流进行输入/输出操作的多种包装类以适用多种应用场景:

字节流:8 bit,Java Stream

字符流:16 bit,字符集、字符编码

2.2 Java blocking I/O 网络通信实现

--客户端Socket的使用方式:

创建Socket对象,使用创建的Socket连接远程主机

建立连接后,从Socket得到输入流与输出流,Socket是全双工通道,可以使用这两个流与服务器之间相互发送数据

--服务端ServerSocket的使用方式:

绑定一个特定的端口创建ServerSocket对象

使用ServerSocket的accept()方法监听这个端口的请求连接,accept()会一直阻塞直到通过某个请求连接与客户端建立连接,此时accept()将返回客户端与服务端的连接的Socket对象

通过Socket对象的getInputStream()与getOutputStream()方法获得与客户端通信的输入流与输出流,进行通信交互

完成交互后关闭连接

3.Java Non-blocking I/O (NIO) 介绍

3.1 Buffer 缓冲区

在Classic I/O库中,数据直接面向Stream写入或者读取,而在NIO库中,数据读取与写入面向的是Buffer对象,这种差异使性能得到了巨大提高

缓冲区实质上是一个数组,java.nio库中提供了Buffer的抽象类

四个属性:0 <= 标记(Mark) <= 位置(Position)<= 上界(Limit)<= 容量(Capacity)

3.2 Channel 通道

Classic I/O中的Stream是单向的,通过OutputStream实现输出流,InputStream实现输入流。而NIO中的Channel是一个全双工通道,可以通过Channel实现同时读取与写入。如果说Buffer是运输沙子的卡车,Channel就是卡车行驶的道路。

文件读写通道、网络读写通道:

FileChannel:

DatagramChannel:通过UDP协议读写网络数据

SocketChannel:通过TCP/IP协议读写网络数据,客户端连接通道

ServerSocketChannel:SocketChannel对应的服务端通道实现,通过监听新的TCP/IP连接,对每一个新的连接创建新的SocketChannel

3.3 Selector 选择器

Channel在Selector上注册,Selector通过不断轮询注册在其上的Channel,能够感知到Channel可读或者可写事件

3.4 Java I/O 复用网络通信实现

NIO实现I/O复用模型整个编程模型较为复杂。在实际项目中,一般不会直接使用原生NIO的API构建网络通信程序,而是使用Mina、Netty、Grizzly其中之一来构建我们的网络通信服务。

4.NIO2 及 Asynchoronous I/O 介绍

NIO2主要改进了Classic I/O中java.io.File类对文件操作的局限性

NIO2还带来了真正意义上的Asynchronous I/O(异步I/O),具体实现分为文件Asynchronous I/O与网络传输Asynchronous I/O

4.1 NIO2 在 File 操作方面的升级

Path介绍:URI,FileSystems

Paths、Files工具类介绍

WatchService接口:提供了通过应用程序监听操作系统文件变更事件的能力

4.2 文件读写 Asynchronous I/O

NIO2通过AsynchronousFileChannel提供了异步读写文件的功能。通过AsynchronousFileChannel异步读写文件有CompletionHandler与Future两种方式。

4.3 Java 异步 I/O 网络通信实现

NIO2通过引入AsynchronousSocketChannel与AsynchronousServerSocketChannel实现了异步I/O网络通信模型。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值