使用传统的输入输出流,当读取输入流中的数据如果没有没有读到有效的数据时,程序将在此处阻塞该线程的执行(使用InputStream的read方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),传统的输入、输出流都是阻塞式的输入输出。不仅如此,传统的输入、输出流都是通过字节的移动来处理的(即使我们可以不直接去处理字节流,但底层的实现还是依赖于字节处理流),也就是说面向流的输入、输出系统一次只能处理一个字节,因此面向流的输入、输出系统通常效率不高。

从jdk1.4开始,java提供了一系列改进的输入、输出处理的新特性。新IO和传统的IO有相同目的,都是用于进行输入、输出的功能。

新IO使用了不同的方式来处理输入、输出,新IO采用内存映射文件的方式来处理输入输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了,通过这种方式来进行输入、输出比传统的输入输出要快的多。

新IO中的两个核心的对象是:Buffer(缓冲)和Channel(通道)。Channel与传统的InputStream、OutputStream最大的区别在于它提供了一个map方法,通过该map方法可以直接将“一块数据”映射到内存中去。如果说传统的流处理方式是面向流的,那么新IO则是面向块的处理。Buffer可以被理解成一个容器,它的本质是一个数组,发送到Channel中的所有对象都必须放到Buffer中,而从Channel中读取的数据也必须先读到Buffer中。

一、Buffer

Buffer是一个抽象类,从内部结构来看,Buffer就像一个数组,它可以在底层字节数组上进行set/get操作。对应其他基本数据类型(boolean除外)都有相应的Buffer类:ByteBuffer、CharBuffer、ShortBuffer、等。

创建Buffer对象:static   XXXBuffer allocate(int capacity)

在Buffer中有三个重要的概念:容量(capacity)、界限(limit)、和位置(position)(位置是从0开始的)。

当Buffer装入数据结束后,调用Buffer的flip方法,该方法将limit设置为position所在位置,将position设置为0,这样使得从Buffer中读取数据时总是从0开始。

当Buffer输出数据结束后,Buffer调用clear方法,clear方法是将position设置为0,limit设置为capacity,这样为再次向Buffer中写入数据做好准备。

二、Channel

Channel类似于传统的流对象,但与传统的流不同的是,Channel有两个主要的区别:

①、Channel可以直接将指定文件的部分或全部直接映射成Buffer。

②、程序不能直接访问Channel中的数据,包括读取、写入都不行,Channel只能与Buffer进行交互。

Channel也是一个接口,系统为该接口提供了DatagramChannel、FileChannel等实现类。

所有的Channel都不应该通过构造器来创建,而是通过传统的节点InputStream、OutputStream的getChannel方法来创建。在RandomAccessFile中也包含一个getChannel方法。

Channel中最常用的三个方法:map、read、write,其中map方法用于将Channel对应的部分或全部数据映射的ByteBuffer。

java中的NIO的更多相关文章

  1. Java中的NIO基础知识

    上一篇介绍了五种NIO模型,本篇将介绍Java中的NIO类库,为学习netty做好铺垫 Java NIO 由3个核心组成,分别是Channels,Buffers,Selectors.本文主要介绍着三个 ...

  2. JAVA中的NIO (New IO)

    简介 标准的IO是基于字节流和字符流进行操作的,而JAVA中的NIO是基于Channel和Buffer进行操作的. 传统IO graph TB; 字节流 --> InputStream; 字节流 ...

  3. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

  4. Java中的NIO和IO的对比分析

    总的来说,java中的IO和NIO主要有三点区别: IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器(Selectors) 1.面向流与面向缓冲 Java NIO和IO之间第一个最大的 ...

  5. Java中的NIO及IO

    1.概述 Java NIO(New IO) 是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同, ...

  6. JAVA中的NIO(二)

    一.内存文件映射 内存文件映射允许我们创建和修改那些因为太大而不能放入内存中的文件.有了内存文件映射,我们就可以假定整个文件都在内存中,而且可以完全把文件当作数组来访问. package com.dy ...

  7. JAVA中的NIO(一)

    1.IO与NIO IO就是普通的IO,或者说原生的IO.特点:阻塞式.内部无缓冲,面向流. NIO就是NEW IO,比原生的IO要高效.特点:非阻塞.内部有缓存,面向缓冲. 要实现高效的IO操作,尤其 ...

  8. JAVA 中BIO,NIO,AIO的理解

    [转自]http://qindongliang.iteye.com/blog/2018539 ?????????????????????在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解 ...

  9. JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  10. JAVA 中BIO,NIO,AIO的理解 (转)

    转自: http://qindongliang.iteye.com/blog/2018539 另外类似可参考资料 :http://www.360doc.com/content/13/1029/20/9 ...

随机推荐

  1. BZOJ 2002 LCT板子题

    思路: LCT啊... (分块也行) 不过YOUSIKI出了一道“弹飞大爷” 就不能用分块水过去了 //By SiriusRen #include <cstdio> #include &l ...

  2. History of the browser user-agent string--转

    https://webaim.org/blog/user-agent-string-history/ In the beginning there was NCSA Mosaic, and Mosai ...

  3. MVC学习日记(三)EntityFramework

    其实学会了第一篇的创建和第二篇的使用以后,基本的mvc操作足够了,至于验证神马的,还不如用Jquery.h5的好看适用,所以接下来, 后续上会讲一些比较实用的. 在之前的文章说到了基础的使用, 那么, ...

  4. 易观OLAP算法大赛结果揭晓,开源组黑马放大招!

    100+天激烈赛程,40+国内顶级技术豪门对决,历经研发内部测试.正式环境测试和易观数据正式环境跑benchmark三大阶段.10月28日,易观OLAP算法大赛优胜名单出炉! 40+技术门派比武 易观 ...

  5. PhotoZoom官方这举动,大写服!

    上上周,PhotoZoom Classic7首次特惠活动大家都知道哈~~ 厂商福利限量30套,仅售99RMB,活动一经上线,半天时间一售而光,这说明不是大家不需要这个智能小软件啊,而是,可能,大概,也 ...

  6. 脚本自动化部署varnish源码包

    #!bin/bash#功能:自动化部署 varnish 源码包软件,运行脚本前,需提前下载 varnish-5.0.0.tar.gz#作者:liusingbonyum -y install gcc r ...

  7. Centos7 执行firewall-cmd –permanent –add-service=mysql报错“ModuleNotFoundError: No module named 'gi'”

    因为目前环境Python3.x与Python2.x版本并存,所以导致以上问题. 解决方法: 第一步,vim  /usr/bin/firewall-cmd, 将#!/usr/bin/python -Es ...

  8. python之UnittTest模块

    一. UnitTest单元测试框架 1.1概述 unittest原名为PyUnit,是由java的JUnit衍生而来.单元测试是对程序中最小的可测试模块(函数)来进行测试:对于单元测试,需要设置预先条 ...

  9. C++基础 (3) 第三天 构造函数 构造函数初始化列表 拷贝构造函数 析构函数 静态成员变量

    // 同类之间无私处 2构造函数 3析构函数 4构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...

  10. ApacheBench 测试性能并使用 GnuPlot 绘制图表

    转自:http://blog.csdn.net/fdipzone/article/details/18827069 ApacheBench 测试性能并使用 GnuPlot 绘制图表 Apache Be ...