Java NIO教程 前言
阅读本文前,建议你先了解 旧I/O
NIO 是 New I/O 的缩写,要了解它真正的内涵,需要掌握的知识还是比较多的。我努力在这几篇笔记里,勾勒出整个io的面貌。为大家的深入学习铺路。
I/O简史
想理解I/O的全部,java的I/O历史是必须要了解的。java的I/O历史也从一个侧面反应了java的发展史。
JDK1.0-1.3
在这个时期的java中,基本上可以说没有完整的I/O支持。因为这一时期的java I/O操作是阻塞的,所以I/O效率是较为底下的,基本上想要有比较好的I/O解决方案,基本靠自己。这时期java在服务器端一直没有得到重用,和糟糕的I/O效率是有很大的关系的。不但I/O弄的不好,而且一系列周边措施都没弄好。所支持的字符集编码有限,经常要进行手工的编码工作。而且没有正则表达式,处理数据十分困难。
JDK1.4-1.6
2002年发布的java1.4中,非阻塞I/O以JSR-51的身份加入到java语言中。同时字符集的编解码能力大大提升。而且有了基于perl实现的正则表达式类库。同时部分旧I/O底层实现,也用新I/O的方式重写,使得旧I/O的性能也有了提升。终于java在服务器端开始流行了起来。
与此同时,第三方也开始发力。谷歌发布了Guava类库,其中的I/O部分,极大的简化了一些文件的操作和数据的传输。同时Trustin Lee领导编写的nio框架netty与mina也广为流传开来,这对java nio的发展业是有着极大的推动力的。
JDK1.7至今
随着JSR-203的推出,是我们在java1.7中见到了NIO2。它为我们提供了必非阻塞更加强大的异步I/O操作能力,同时提供了一系列极为方便的对文件系统和文件属性进行操作的API。以及更加强大的网络I/O
I/O区别
阻塞I/O、非阻塞I/O、异步I/O之间到底有什么区别?为什么每一次的进步,都会促使java I/O能力的极大提升?我们举一个种菜游戏的例子。
假如有一个种菜游戏(就跟之前的QQ农场类似),在玩家种菜以后,必须一直呆在那个网页上,看着菜成熟,才可以收菜。这是极其浪费时间的,用户体验也一定不会好。这个游戏后来进行了改版,玩家种菜之后不用再一直停留在那个网页上了,只是需要时不时来看一遍,如果某一次查看时发现菜成熟了,就可以收菜了。当然,用户体验极大的提升了,用户所浪费的时间也减少了,但是为了更加提升用户体验,游戏又进行了改版。玩家种菜之后,不用再查看菜是否成熟了,等到菜成熟后,该游戏会自动给用户发送一个通知,告诉他,菜已成熟、赶紧来收。这样用户的基本上再也不用浪费时间了。
刚刚例子中的三个游戏版本,代表了三种I/O。阻塞I/O:在数据没有读写完成之前,CPU不可以进行下一步操作,这样CPU只好眼睁睁的在那里傻等。非阻塞I/O:在数据没有读写完成之前,CPU可以离开,只需要每隔一段时间询问一次。异步I/O:在数据没有读写完成之前,CPU可以离开也不用时不时的关心一下I/O,在数据读写完成时,主动通知CPU。三种I/O之间的效率,高低立判。
新I/O
咱们以java1.4所提出的非阻塞I/O,为切入点,开始了解全貌。
- Channels
- Buffers
- Selectors
这三个类构成了非阻塞I/O的核心API。
Buffer译为缓存区,它是一块可以存储数据的内存。Channel有点像流,但它可读可写、从本地I/O到网络I/O都可以,绝大多数NIO都从一个Channel开始的,数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。

非阻塞I/O中,CPU可以在数据没有读写完成之前离开,只需要每隔一段时间询问一次。询问数据是否读写完成,需要的CPU能力是极小的,但如果CPU经常切换任务所需要的保留现场和恢复现场的时间是较大的。所以可以就用一个线程来询问数据是否准备好。一个线程在多个通道内询问数据是否准备好,就需要管理多个通道的方式,这就是
。
使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件。
说了这么多,我们该从什么地方开始呢? 咱们从java7的新文件系统开始吧
Java NIO教程 前言的更多相关文章
- Java NIO教程 目录
"Java NIO系列教程" 是笔者hans为NIO的初学者编写的一份入门教程,想仔细学习的同学可以按照顺序去阅读.由于我学的也不是特别的精,所以错误.疏漏在所难免,希望同学们指正 ...
- 海纳百川而来的一篇相当全面的Java NIO教程
目录 零.NIO包 一.Java NIO Channel通道 Channel的实现(Channel Implementations) Channel的基础示例(Basic Channel Exampl ...
- Java NIO 教程
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO. Java NIO提供了与 ...
- Java NIO教程 文件系统
在NIO.2的文件系统中,Path是一切操作的基础.Path准确来说,代表着文件系统中的位置.可以代表一个目录(也就是通常所说的文件夹),也可以代表一个文件. 在新文件系统中,还有一个不得不说的就是F ...
- Java NIO教程 MappedByteBuffer
之前跟大家说过,要讲MappedByteBuffer,现在我来履行承诺了. 首先从大体上讲一下MappedByteBuffer究竟是什么.从继承结构上来讲,MappedByteBuffer继承自Byt ...
- [翻译] java NIO 教程---介绍
原文地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO(new IO)是从java1.4之后的对IO API的另一种选择,即对标准j ...
- [转载] Java NIO教程
转载自并发编程网 – ifeve.com http://ifeve.com/java-nio-all/ 关于通道(Channels).缓冲区(Buffers).选择器(Selectors)的故事. 从 ...
- Java NIO教程 Selector
这次我们开讲非阻塞I/O中的Selector,它需要配合非阻塞的TCP和UDP来使用.首先我们先简单讲一下TCP和UDP的非阻塞通道. 非阻塞I/O通道 在上代码前我们先讲解一些最基本的知识.TCP和 ...
- Java NIO教程 Channel
Channel是一个连接到数据源的通道.程序不能直接用Channel中的数据,必须让Channel与BtyeBuffer交互数据,才能使用Buffer中的数据. 我们用FileChannel作为引子, ...
随机推荐
- C语言实现Web客户端(转-kungstriving)
和我的上一篇文章是一起写的,呵呵,大家给提点意见啊. :-) /*********filename : Client.cpp**************** 该程序通过标准socket实 ...
- LeetCode() Repeated DNA Sequences 看的非常的过瘾!
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- 关于SCRUM站立会议
查询过后对SCRUM站立会议有了初步的了解 站立会议:在敏捷流程的冲刺阶段中,每一天都会举行项目状况会议,强迫每个人向同伴报告进度,迫使大家把问题摆在明面上,这个会议被称为“scrum”或“每日站立会 ...
- spring 3 mvc hello world + mavern +jetty
Spring 3 MVC hello world example By mkyong | August 2, 2011 | Updated : June 15, 2015 In this tutori ...
- post 与 get 在转码的区别
前端输入中文的时候,后端post通过 String text = getRequest().getParameter("text");可以正常拿到中文, 但是通过get的时候就会出 ...
- Spring 学习总结 使用静态工厂创建Bean
创建Bean时,class属性必须指定,此时为静态工厂类. factory-method指定静态工厂方法名. 接口: public interface Being { public void test ...
- C++多重继承带来的问题
首先上图,咱们看图说话! 橙色表示变量,使用private修饰. 如图,假设Person类的变量name只能通过input方法来输入. 那么继承自Person的Student及Teacher类中s ...
- SonarQube的安装、配置与使用
SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 准备工作: 1.jdk(不再介绍) 2.sonarqube:ht ...
- 面对一个新的MCU,我再也不敢说第一步是点灯了
折腾了几天AT91SAM3S,今天才算是把开发板上的3个LED点亮. 在点亮之前,起码看了百八十页的Datasheet,动用了N次百度. 各种时钟,看门狗,分散加载,中断向量,都得去整.这些都远远超过 ...
- 将STM32的标准库编译成lib使用【图文】
以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间.每次建立工程都这么编译,是一个相当浪费时 ...