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网络通信模型。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
基于 TensorFlow 、OpenCV 和 Docker 的实时视频目标检测
在本文中,我将介绍如何在 Docker 容器中使用 Tensorflow Object-detection API 来执行实时(网络摄像头)和视频的目标检测。我使用 OpenCV 和 python3 的多任务处理库 multiprocessing、多线程库 multi-threading。 我会重点描述我在搭建过程中遇到的问题,以及我的解决方案 (有些还未解决)。完整的代码在这里 my Github: https://github.com/lbeaucourt/Object-detection 使用Youtube视频进行视频处理测试 动机 我们从 Dat Tran 这篇文章开始挑战实时目标检测。我将使用 python 的 multiprocessing 库,增加处理网络摄像头时的 FPS。为了进一步提高可移植性,我将项
- 下一篇
C# DataGridview控件自动下拉到最后一行
有时候使用DataGridView难免会在最后插入一条数据,如果插入的数据超过滚动条显示的行数,那么默认情况下不会显示到最后一行。增加以下代码一直将滚动条拉倒最低。 this.dataGridView1.FirstDisplayedScrollingRowIndex = this.dataGridView1.Rows.Count - 1;
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路