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. 使用码云给同事地址地址注意事项
  2. Http和Socket连接区别(ZT)
  3. 分布式事务最经典的七种解决方案
  4. python函数进阶小结_Python-进阶-functools模块小结
  5. spoj Help the Military Recruitment Office!
  6. java文件拷贝时 buff给多大合适_Java复制文件
  7. 经典DL论文研读(part4)--ImageNet Classification with Deep Convolutional Neural Networks
  8. 淡定的写代码,淡定的人生
  9. Windows Phone开发(14):数据模板 转:http://blog.csdn.net/tcjiaan/article/details/7350849...
  10. 三维空间中椭圆的参数方程
  11. Flutter入门综合练习
  12. mock.js使用指南
  13. -ile “……的“ 形容词后缀
  14. MODBUS TCP/IP通信协议及测试方法
  15. 大数据相加_大数据的相加和相乘
  16. 2013年第四届C/C++ A组蓝桥杯省赛真题
  17. [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件
  18. 联合循环—25(了解PID原理图1)
  19. 趁“未老”,再认真一次,我觉得你能更好!
  20. 计算机研究生男女比,复旦大学各学院研究生男女比例出炉:最低的仅8:100,最高409:100...

热门文章

  1. mybatis generator使用_SpringBoot整合Mybatis实现自动生成代码 || 附阿里P8独家SpringBoot视频资料...
  2. SkinSharp皮肤模块源码 原33个皮肤模块
  3. 计算机教学学生创新能力,职业技术学校创新能力计算机教学论文
  4. 将一个项目布到服务器上,怎么在云服务器上布项目
  5. .net foreach 未执行完就到下一行了_PHP五十个提升执行效率的小技巧,和常见问题...
  6. WordPressmodown收费模板
  7. 检查xml文件中包含非法xml字符的个数(
  8. 围观 Joomla, Wordpress 和 Drupal
  9. WebBrowser部分用法
  10. 企业类库 add access 2007