java_IO流之 NIO

NIO 定义

即新IO,在JDK1.4的java.nio.*包中引入,其目的在于提高速度。

在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,面向流的I/O速度非常慢,而在Java 1.4中推出了NIO,这是一个面向块的I/O系统,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据库,按块处理要比按字节处理数据快的多。

速度的提高来自于所使用的结构更接近于操作系统执行IO的方式:通道和缓冲期。我们可以把它想象成一个煤矿,通道是一个包含煤层(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。卡车满载煤炭而归,我们再从卡车上获得煤炭。也就说,我们并没有直接好通道交互,我们只和缓冲区交互。

缓冲区(Buffer)

缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。,在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,它也是写入到缓冲区中的;任何时候访问 NIO 中的数据,都是将它放到缓冲区中。而在面向流I/O系统中,所有数据都是直接写入或者直接将数据读取到Stream对象中。

在NIO中,所有的缓冲区类型都继承于抽象类Buffer,最常用的就是ByteBuffer,对于Java中的基本类型,基本都有一个具体Buffer类型与之相对应,它们之间的继承关系如下图所示:
KXBLKaR.png

Buffer基本用法

使用Buffer读写数据一般遵循以下四个步骤:

  1. 写入数据到Buffer
  2. 调用flip()方法
  3. 从Buffer中读取数据
  4. 调用clear()方法或者compact()方法

当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。

一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

通道(Channel)

通道是一个对象,通过它可以读取和写入数据,当然了所有数据都通过Buffer对象来处理。我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的缓冲区。同样不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步读写
  • 通道中数据总要先读到Buffer,或者从一个Buffer写入

ksFwcc2.png

这个图看着好混乱,那我们讲几个比较重要的通道:

  • FileChannel : 从文件中读写数据。
  • DatagramChannel :通过UDP读写网络中的数据。
  • SocketChannel :通过TCP读写网络中的数据。
  • ServerSocketChannel: 监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

Channel基本用法

  1. 获取Channel
  2. 创建Buffer
  3. 将数据从Channel读取到Buffer

为了说明,下面举个读文件的例子。

    public static void main(String[] args) {try {FileInputStream fin = new FileInputStream("test.txt");// get channelFileChannel fc = fin.getChannel();// bufferByteBuffer buffer = ByteBuffer.allocate(1024);//read data to bufferfc.read(buffer);buffer.flip();while(buffer.remaining()>0){byte b = buffer.get();System.out.print((char)b);}fin.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

阻塞IO(常规IO) VS 非阻塞IO(NIO)

  • Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。
  • Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情;非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

所以这就引入一个概念,选择器

选择器(Selectors)

Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。

你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

使用

要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。

转载于:https://www.cnblogs.com/tina-smile/p/5245326.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS iPhone SDK 包含哪些东西?

From: http://www.cnblogs.com/jy578154186/archive/2013/02/27/2934881.html iPhone SDK 包含哪些东西? 第一部分: 在使用Intel芯片的Macintosh计算机开发iOS应用程序所需的全部接口、工具以及资源全都包含于iPhone SDK。 苹果公司将大部分系…

[Redux/Mobx] 你有使用过redux-saga中间件吗?它是干什么的?

[Redux/Mobx] 你有使用过redux-saga中间件吗?它是干什么的? redux-saga 就是用来处理副作用(例如:AJAX请求)的一个中间件,使用Generator 函数 个人简介 我是歌谣,欢迎和大家一起交流前后端知…

python Pillow 的简单案例

#代码来自 实验楼https://www.shiyanlou.com/courses/ #encodingutf-8#/usr/bin/env pythonfrom PIL import Imageimport argparse parser argparse.ArgumentParser() parser.add_argument(file)parser.add_argument(-o , --output)parser.add_argument(--width, t…

“我的电脑”右键“管理”打不开,提示“该文件没有与之关联的程序来执行该操作“

From: http://bbs.kafan.cn/thread-1240058-1-1.html 如图: 右键单击桌面上的“我的电脑”,再点“管理”就弹出这个对话框了。 【该文件没有与之关联的程序来执行该操作。请安装一个程序,或者,如果已安装程序,请在“…

[Redux/Mobx] Redux怎样重置状态?

[Redux/Mobx] Redux怎样重置状态? 先在store初始化时对store的初始化数据状态进行保存,然后reducer中多定义一个重置状态的type"RESET"的action的逻辑,这个操作里面直接返回初始的状态值,在需要重置状态的时候&#xf…

Java数据结构--HashTable(拉链法)

双向节点 /*** Created by root on 16-3-6.*/ public class Node<E> {public E data;public Node prev;public Node next;public Node(E target,Node prev,Node next){//链接两个孤立节点datatarget;this.prevprev;this.nextnext;}public Node(){this(null,null,null);}p…

[交流] 新手常见(五国)(-v图)错误解决(原版,破解kernel,补丁kext下载)

From: http://blog.csdn.net/ashuai81/article/details/8032952 原文出处&#xff1a;http://bbs.pcbeta.com/viewthread-863656-1-1.html 谢谢大神&#xff0c; 看了这个才弄出了黑苹果。 在可安装的主版硬件上&#xff0c;安装Mac不该是个大问题&#xff0c;声卡、显卡、…

[Redux/Mobx] Context api可以取代Redux吗?为什么?

[Redux/Mobx] Context api可以取代Redux吗&#xff1f;为什么&#xff1f; 可以&#xff0c;但是并不完美。 利用Context APIuseReducer的方案可以实现简化版的Redux。 Redux除了能够存储数据之外&#xff0c;它的强大之处还在于数据修改的单一性&#xff0c;清晰的数据流向&a…

四则运算题1

/*信息&#xff1a;20133075 张勋 《随机生成30道四则运算题目》要求&#xff1a;除整数外&#xff0c;还要支持真分数的四则运算设计思路&#xff1a; 1.通过radom函数生成自然数&#xff0c;给变量赋值 2.另一个变量是真分数&#xff0c;分子比分母小 3.随机生成四则运…

Redux/Mobx面试题汇总

[Redux/Mobx] redux和flux的区别是什么&#xff1f; [Redux/Mobx] 什么是redux&#xff1f;说说你对redux的理解&#xff1f;有哪些运用场景&#xff1f;[Redux/Mobx] 在React中你是怎么对异步方案进行选型的&#xff1f; [Redux/Mobx] 推荐在reducer中触发Action吗&#xff…

RTP传输H264时的sps和pps的获取

From: http://wmnmtm.blog.163.com/blog/static/38245714201192491746701/ 使用RTSP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set (PPS)需要用到,那么这两项从哪里获取呢?答案是从H264码流中获取.在H264码流中,都是…

54.施工方案第二季(最小生成树)

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的。工兵连受命来到阵地要进行两期施工。 第一期的任务是挖掘暗道让所有地堡互联互通。现已勘测设计了m条互不相交的暗道挖掘方案&a…

jQuery面试题汇总

【jQuery】 [jQuery] 针对jQuery的优化方法有哪些&#xff1f; [jQuery]JQuery一个对象可以同时绑定多个事件&#xff0c;这是如何实现的&#xff1f; [jQuery] jQuery中如何将数组转化为json字符串&#xff0c;然后再转化回来&#xff1f; [jQuery] jQuery UI怎样自定义组…

H264中的SPS、PPS提取与作用

From: http://blog.csdn.net/sunnylgz/article/details/7680262 牛逼的视频会议网站&#xff1a;http://wmnmtm.blog.163.com/blog/#m0 http://wmnmtm.blog.163.com/blog/static/38245714201192491746701/ 使用RTP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Pa…

POJ 3991 Seinfeld

Seinfeld Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1285 Accepted: 599 Description I’m out of stories. For years I’ve been writing stories, some rather silly, just to make simple problems look difficult and complex problems look easy. …

HTML面试题汇总

【HTML】 [html] 你有使用过MediaRecorder吗&#xff1f;说说它的运用场景有哪些&#xff1f; [html] 进入编辑页面时&#xff0c;如何把光标聚焦到第一个input&#xff1f; [html] 如何给input的右上角加个清除的按钮 [html] 举例说明只用html和css如何使得一个列表编号倒…

H264参数语法文档: SPS、PPS、IDR

From: http://blog.csdn.net/heanyu/article/details/6205390 H.264码流第一个 NALU 是 SPS&#xff08;序列参数集Sequence Parameter Set&#xff09; 对应H264标准文档 7.3.2.1 序列参数集的语法进行解析 SPS参数解析// fill sps with content of p[cpp] view plaincopyint …

悬浮动态分层导航

1、首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果&#xff08;从网站上下载即可&#xff09; 1 <script language"javascript" type"text/javascript" src"js/jquery-1.4.2.min.js"></script> 2、插入div&…

[Redux/Mobx] Redux怎么添加新的中间件?

[Redux/Mobx] Redux怎么添加新的中间件&#xff1f; applyMiddleware 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

php操作xml

<?php $xmlfile_get_contents("c.xml"); $simplenew SimpleXMLElement($xml); //var_dump($simple); //1查询 echo "<table border1>"; foreach ($simple->book as $book) {$attr$book->attributes();//获取节点属性echo "<tr>…