30. Java IO与NIO。
IO:面向流、阻塞IO
NIO:面向缓冲、非阻塞IO,选择器配置多通道
面向流与面向缓冲:是javaNIO和IO最大的区别
Java IO是面向流的,NIO是面向缓冲的。IO面向流意味着每次从流中读取一个或者多个字节甚至所有都不会被缓存在任何地方。他也不能前后移动数据流中的数据。如果需要移动从流中读取的数据,需要现将他还存在一个缓冲区。
Java NIO的缓冲导向方法略有不同,数据读取到一个他稍后处理的缓冲区后,需要时可在缓存取中 前后移动。这增加了处理过程中的灵活性。但是,这样就需要检查该缓冲区中包含所有你需要处理的数据,并且要确保当更多的数据读入缓冲区后,不要覆盖缓冲区中的尚未处理的数据。
阻塞和非阻塞IO:
Java IO的各种流是阻塞的,这意味着,当一个线程调用read() write()时,该线程被阻塞,知道一些数据被读取或者数据完全被写入。该线程在此期间,不能在做任何其他事。
Java NIO的非阻塞模式,是一个线程从某通道发送请求读取数据,但是他仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会被读取。而不是保持线程阻塞,所以直至数据变的可读取之前,该线程可以继续做其他事情。非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入输出通道channel.
选择器selectors
Java NIO选择器允许一个单独的线程监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已经准备写入的通道。这种选择机制,使得一个单独的线程很容易管理多个通道。
API调用:
使用NIO的API调用与IO不同,因为并不是仅从一个InputStream逐字节读取,而是数据必须先读入缓冲区在处理。
数据处理:
IO设计中,从InputStream或者Reader逐个字节读取数据。
Name:cao wei
Age:18
Email:123456@qq.com
InputStream input...
BufferReader reader = new BufferReader(new InputStreamReader(input));
reader.readLine();
reader.readLine();
reader.readLine();
...
其处理状态由执行的结果决定,一旦reader.readLine()方法返回,就能肯定文本行已经读完,readLine()阻塞直到整行读完,这就是原因。你知道这一行包含名称,同样第二个readLine()调用返回的时候,你也知道这一行返回年龄信息。正如你看到的,该处理程序仅在有新数据读入时运行,并直到每一步处理的数据是什么样。一旦正在运行的先策划那个已处理过读入的某些数据命该线程不会在rollback数据.
JAVA IO:
NIO设计中,首先将数据缓冲,
ByteBuffer buffer = ByteBuffer.allocate(222);
int bytesRead = inChannel.read(buffer);
这时从通道重读取字节到ByteBuffer,这个方法调用返回时,你无法确定你所需要所有数据是否全部在缓冲区。你只知道,该缓冲区包含一些字节,使得处理麻烦些。
假设第一次read(buffer),读入缓冲区的只有 “Name:cao w”,显然就不能处理了,这时候要等待整行数据读取缓存,在此之前对数据的任何处理都是没有意义的。
这就多了算法来计算缓冲区是否包含了我们期望的数据可以处理?其实你不知道,线程也不知道,结果就是在你知道所有的数据都在缓冲区之前,必须检查几次,这样效率底下,程序还要额外的开销。
ByteBuffer buffer = ...
while(!bufferReady(byteRead)){
...
}
bufferReady()必须跟踪是否市局已经完全读入缓冲区,根据缓冲区是否已经满,返回true/false:如果换成哦功能区准备好被处理了,就是满了。
当然,有些特殊场景,并不取全部数据而是一部分就够了。我们只说明generic normal logic.
NIO允许你使用一个单线程(多个)分别管理多个通道,但是额外的计算缓冲区状态也会比一个阻塞流中读取数据更加复杂。
对于同时打开千万个连接的引用,这些连接每次只是发送少量的数据,如QQ、微信即时消息服务器,NIO是理想的选择。
相关推荐
"Core Java Interview Questions"这个资源集锦了面试中可能会遇到的一些关键问题,旨在帮助求职者更好地准备Java核心技术的面试。以下是根据描述和标签提炼出的一些核心Java知识点: 1. **Java基础** - 类与对象:...
Core Java Interview Question Page 1
从国外网站上下载的Java面试题。可以看看国外公司的Java面试常用题,以及如何用英文回答。
这本书名为《Core Java Interview》,其内容是关于Java面试的,英文版本,是一本适合想要面试Java职位的求职者的实用指南。它由Sam Atkinson撰写,并在Leanpub网站上出售,于2016年5月21日发布。Leanpub是一种轻量级...
CoreJava全套详细笔记资料.pdf CoreJava是Java编程语言的核心部分,涵盖了Java语言的基础知识和高级应用。以下是对给定文件的详细解读和知识点总结: 一、原码、反码、补码 * 原码是指一个数的二进制表示形式,...
【Core Java】是Java编程的基础教程,主要涵盖了Java语言的核心概念和使用方法。在学习Core Java时,首先要理解以下几个关键知识点: 1. **类与对象**:类是面向对象编程的基础,是描述某一类事物共性的抽象,而...
Java.Interview.Guide.How.to.Build.Confidence.With.a.Solid.Understanding.of.Core.Java.Principles.B015HF9SJQ.pdf Java.Interview.Guide.How.to.Build.Confidence.With.a.Solid.Understanding.of.Core.Java....
CoreJava是Java的基础,涵盖了Java Standard Edition (J2SE)的主要内容,包括基本语法、面向对象编程(OO)原则、核心类库的使用等。在学习CoreJava时,我们需要掌握以下几个关键知识点: 1. **编程思想**: - ...
Java 核心技术 第八版-第1和2卷+源代码【Core Java 8th Edition】内附资源: Core Java. Volume I. Fundamentals, 8th Edition.pdf ; Core Java. Volume II. Advanced Features, 8th Edition.chm ; Core Java 8th ...
CoreJava DAY01 Java概述 1 CoreJava DAY02 数据类型和控制结构 6 CoreJava DAY03 数组 11 CoreJava DAY04 15 CoreJava DAY05 面向对象 17 CoreJava DAY06 类的加载过程、实例化、继承、多态 20 CoreJava DAY07修饰...
【标题】:“Core Java,Java核心编程” 【描述】:“Java语法基础,Java面向对象编程,图形用户界面(GUI)编程,Java网络编程:Socket编程” 【标签】:“corejava” 在计算机编程领域,Core Java是指Java的...
Interview Questions in Core Java 1.what is a transient variable? A transient variable is a variable that may not be serialized.
Core Java for the Impatient 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
《Core Java.JAVA核心技术(中文版)》是学习Java编程的重要参考资料,主要涵盖了Java语言的基础以及进阶知识。这本书深入浅出地讲解了Java的核心概念和技术,为读者提供了全面而细致的学习路径。以下是对该书内容的...
Core Java 学习必备PPT(CoreJava教案)
CoreJava DAY01 Java概述 1 CoreJava DAY02 数据类型和控制结构 10 CoreJava DAY03 数组 20 CoreJava DAY04 27 CoreJava DAY05 面向对象 31 CoreJava DAY06 类的加载过程、实例化、继承、多态 37 CoreJava DAY07修饰...
《Core Java 1&2》是Java编程领域中两本非常经典的教材,分别对应于卷1和卷2,英文版提供了全面且深入的Java学习资源。这两本书由Cay S. Horstmann和Gary Cornell撰写,是许多程序员入门和进阶Java技术的重要参考书...
《深入解析CoreJava源码》 CoreJava是Java编程领域中的经典教材,其源码对于初学者和有经验的开发者来说都是宝贵的资源。通过研究CoreJava的源码,我们可以更深入地理解Java语言的底层机制,提升编程技能,并且能够...