IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java NIO及核心组件 -> 正文阅读

[Java知识库]Java NIO及核心组件

Java NIO及核心组件

一、Java IO的演进

发现一篇讲Netty的文章:深入理解Netty

在JDK1.4之前,在Java上所有的IO操作都是同步阻塞IO(BIO),因此那个时候对并发要求比较高的大型项目都用C/C++进行开发,因为C/C++可以直接使用操作系统提供的异步IO能力。

JDK1.4版本,提供了新的NIO类库,Java也可以支持非阻塞IO,称之为NIO。

JDK1.7版本,对NIO类库进行了升级,称之为NIO.2。

在Oracle JavaSE指导文档里,查到一篇文章:Java IO,NIO,NIO.2

Java 的IO支持是在java.iojava.nio包下,目前这些包支持如下特性:

  • 通过数据流(data streams)、序列化(serializable)和文件系统(file system)进行输入和输出;
  • 字符集、编码器、解码器,用于在字节和Unicode字符之间转换;
  • 访问文件、文件属性和文件系统;
  • 用于使用一步或多路复用,非阻塞IO构建可扩展服务器的API;

1.1 Java NIO和Java NIO.2 的区别

Java最初通过在java.io报中提供File类用于读取文件系统。这个类代表一个文件或文件夹,允许你去执行一些操作,例如:检查一个文件或目录是否存在,获取文件属性,删除操作。但是,它有一些缺点,如:

  • 那个File类缺少一些重要的方法,例如:拷贝方法;
  • File类中定义的很多方法返回boolean类型,比如,一个错误出现,返回一个false,而不是抛出异常,开发这很难知道出错的确切原因;
  • 没有提供很好的支持在符号链接上;
  • 提供了一个非常有限的文件属性集;

java.nio包在java4中引入,关键特性如下:

  • 管道(Channal)和选择器(Selectors):一个管道是在底层文件系统特性的抽象,例如,内存映射文件。
  • 缓存(Buffers):缓存所有原始类(除了Boolean);
  • 字符集(Charset)、编码器(encoders)、解码器(decoders),用于在字节和Unicode字符之间转换;

java7中引入了java.nio.file之后,提供了更好的支持为:符号链接、文件属性的读取,以及专门支持通过PathPathsFiles类扩展文件系统。

java7还引入了异步IO:AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel

二、Java NIO上三个重要组件

Java NIO上有三个重要组件: Channel(通道),Buffer(缓冲区),Selector(选择器)。

(1)Channel

在OIO中,java的IO操作通过输入流(Input Stream)和输出流(Output Stream)进行输入和输出。JavaNIO中,Channel相当于输入流和输出流的结合体。既可以从Channel(通道)中读取,也可以向Channel(通道)写入。

(2)Buffer

对Channel(通道)的读取操作,就是把数据从通道读取到缓冲区;

对Channel(通道)的写入操作,就是将数据从缓冲区写入通道中;

(3)Selector

Selector对应“IO多路复用”模型中的select。它是一个IO事件的查询器,通过选择器,一个线程可以查询多个通道的IO事件的就绪状态。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:17:51  更:2022-03-10 22:21:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:39:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码