zoukankan      html  css  js  c++  java
  • nio

    1.I/O 输入输出流
    (1) 指的是计算机与外界,或者程序与计算机之间数据交换的接口。

    (2) 在java编程中,使用 流(Stream) 的方式完成I/O , 所有的I/O都被视为单个字节的移动。
    通过一个Stream对象,一次移动一个字节。
    Stream用于将字节转换为对象,或将对象转为字节。

    (3)NIO和I/O有同样的作用和目的,但是它使用不同的方式,块 I/O

    (4)NIO将最耗时的I/O操作(即最耗时的填充和读取缓冲区),转移回操作系统,因而可以极大地提高速度。

    2.流与块的比较
    (1) I/O和NIO最主要的区别的是数据打包和传输方式的不同。I/O以流的方式传输数据,NIO以块的方式传输数据
    (2) 面向流
    缺点:
    流I/O一次一个字节(8 bit)读取数据。一个输入流产生一个字节数据,一个输出流消费一个字节的数
    据,所以面向流的I/O相当慢。
    优点:
    为流式数据创建过滤器非常容易,链接几个过滤器,比如上面套一个Buffer缓存
    (3) 面向块
    一个面向块的I/O以块的形式处理数据。每一个操作都在一步中产生或消费一个数据块
    优点:按块处理,比按字节处理效率要快的多
    缺点:缺少流的优雅性和简单性

    (4) 流的读取是单向的,而通道是双向的

    3.通道和缓冲区
    (1) 通道是原I/O中流的模拟,数据到任何地方都必须通过一个Channel对象来实现。
    Channel是一个对象,可以通过它读取和写入数据,其作用类似于I/O中的Stream。程序读取数据时,先把数据从通道读入缓冲区,再从缓冲区读数据。
    通道是双向的,而Stream是单向的,只在一个方向上移动(InputStream , OutputStream) ,而通道可以用于读、写,或者同时读写。

    (2) 缓冲区实质上是一个容器对象,发送给一个通道的所有对象都必须首先放到缓冲区;同样的,从通道中读取任何数据都要读到缓冲区中。
    Buffer是一个对象,它用于存放要写入或者刚读出的对象。在NIO中所有的数据都是用缓冲区处理的,当读取数据的时候,它是读取到缓冲区;
    当写入数据的时候它是写入到缓冲区。
    缓冲区实际是一个数组(通常是一个字节数组ByteBuffer,也可以是其它类型的),一个ByteBuffer可以在其底层字节上进行get/set操作。


    4.Buffer内部细节
    Buffer有3个属性描述其在任意时刻的状态,缓冲区Buffer其实是一个数组

    (1) position
    position变量跟踪已经读写了多少数据,比如一个缓冲区长度为10,往里写了3个字节,那其position值就是3,即第4个元素
    如果从缓冲区往外读数据,即把数据写入Channel,如读了5个字节,position值为5,即第6个元素

    (2) limit
    limit表示当前缓冲区有多大容量能放入数据,或者当前缓冲区有多少数据等待被取出。
    a.比如一个Buffer的长度是10,其limit就是10
    b.当往里放5个元素时,position是5,其limit还是10,limit这时是不会变的
    c.当从Buffer中往外取的时候,先调用buffer的flip()方法,其作用是,将limit值置为5,即当前position的值,position置为0

    (3) capacity
    capacity指定了缓冲区底层数组的容量,其值大小不会变。limit不会大于capacity

    5.Buffer方法
    (1) flip() , 将limit值置position的值,position置为0

    (2) clear(),将limit置为和capacity相同,将position置为0,(相当于清空缓冲区,重新接收值)

    (3) get() ,从Buffer读取数据

    (3) put(),往Buffer写数据

    6.直接缓冲区

    (1) 直接缓冲区是一种为了加快I/O速度,而以一种特殊方式分配其内存的缓冲区。
    给定一个直接字节缓冲区,Java虚拟机,将尽最大努力直接对它执行本机I/O操作,也就是说,jvm会在每一次调用底层操作系统的本机I/O操作
    之前或之后,尝试避免将缓冲区的内容,拷贝到一个中间缓冲区中
    看源码??

    7.






















  • 相关阅读:
    SpringBoot集成Mybatis
    springboot通过slf4j配置日志
    SpringBoot导入jsp依赖始终报错
    shiro小记
    阿里开发手册华山版——(编程规约篇)记录目前自己不合理的地方
    [网络流24题] 2. 太空飞行计划问题 解题报告
    LOJ 6089 小 Y 的背包计数问题 解题报告 (动态规划)
    UVA 10599 Blocks 解题报告 (动态规划)
    Comet OJ#12E Ternary String Counting 解题报告
    [WC2016]挑战NPC 解题报告
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/6231711.html
Copyright © 2011-2022 走看看