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,字符集、字符编码

  • Java_io 体系之目录

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网络通信模型。

Java 语言实现的 I/O 模型相关推荐

  1. java写的股票技术分析_基于Java语言开发的个性化股票分析技术:量能突破模型(Energe-Break)...

    基于Java语言开发的个性化股票分析技术: 量能突破模型(Energe-Break) 一个用量能指标作为判定依据的条件分析模型,根据最近5天内是否有量能平台的突破以及涨跌幅的大小给每只股票评分评价,给 ...

  2. 重塑云上的 Java 语言

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Photo @  Toa Heftiba 文 |郁磊 音乐无国界, ...

  3. Java语言中的生僻知识

    最近有一首名叫<生僻字>的流行歌曲火遍大江南北,创作者给佶屈聱牙的生僻字,配上了优美明快的旋律,竟然让歌曲变得琅琅上口.悦耳动听起来,平时不太常见的拒人于千里之外的这些汉字也不再那么陌生, ...

  4. 计算机java语言答案_【计算机二级Java语言】卷019

    选择题 公共知识 [1]下列叙述中正确的是 [A]算法的时间复杂度与计算机的运行速度有关 [B]算法的时间复杂度与运行算法时特定的输入有关 [C]算法的时间复杂度与算法程序中的语句条数成正比 [D]算 ...

  5. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?

    Java语法变化 Java5(2004): 枚举.泛型.注解.封箱(解箱)- Java6(2006): @Override接口 Java7(2011): Diamond语法.多Catch.Try- J ...

  6. java语言_JAVA语言

    Java (计算机编程语言) JavaEE:12天掌握Java语言开发 - Java-环境搭建及基础语法 - 创客学院直播室 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C ...

  7. 2006年4月全国计算机等级考试二级Java语言程序设计

    (考试时间90分钟,满分100分) 一.选择题((1)~(35)每小题2分,共70分)     下列各题A).B).C).D)四个选项中,只有一个选项是正确的,请将正确选项写在答题卡相应位置上,答在试 ...

  8. Android插件化开发基础之Java类加载器与双亲委派模型

    类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...

  9. dart语言和java语言_Java不是文明语言吗?

    dart语言和java语言 几周前,我有机会学习iOS编程. 我的老板认为我更像是"计算机科学家",而不是开发人员,这意味着我可以将自己的知识应用于开发一两个iPad应用程序–我要 ...

最新文章

  1. std::function简介
  2. Android中的Menu
  3. SSM-Spring+SpringMVC+MyBatis整合案例从0到1
  4. windows下 sbulime text 安装less2css踩的几个坑
  5. VisualStudio 的 Spy++ —— 窗口、消息 的 查看分析利器
  6. 05_Grafana的安装和Influxdb数据源配置
  7. 64位处理器_快看看你的电脑是64位还是32位操作系统,处理器支持64位可升级
  8. python编程100例-【python】编程语言入门经典100例--30
  9. windows环境下的YOLO3入门,及opencv344配置
  10. 挂载ntfs_Linux识别移动硬盘ntfs格式
  11. mysql中转换日期格式,MySQL日期格式转换
  12. 计算机应用技术个人研修总结,学习应用信息技术的研修体会总结
  13. 正则匹配,只保留中文、英文、数字
  14. python所有for循环语句都可以用while改写_Python while循环
  15. adjacent angle_adjacent angle是什么意思_adjacent angle怎么读_adjacent angle翻译_用法_发音_词组_同反义词_邻角-新东方在线英语词典...
  16. 股票交易接口api的协议
  17. iPad goodnotes 5 打开很慢“准备自己的资料库,获得更快体验”解决
  18. 肖特基二极管、瞬态二极管、普通二极管等各种二极管的区别?
  19. java-不死神兔百钱百鸡
  20. excel 切片器 html,Excel切片器--数据智能展示的利器

热门文章

  1. js横向滚动_seleniumJS处理滚动条
  2. NDPIC极简昼夜瀑布流图片WordPress主题
  3. java代码雨_代码雨 - java代码库 - 云代码
  4. hadoop tyarn冲突_Hadoop之Yarn
  5. Java | Java语言在Eclipse控制台输入的三种方法
  6. call,apply学习笔记
  7. whmcs精仿雨云ModuleSky主题模板
  8. 移动开发在路上-- IOS移动开发系列 多线程一 [转]
  9. 下载虚拟化的mac 系统
  10. C#上传文件的一个实现