NIO学习笔记一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzx_longyou/article/details/51967887

首先感谢以下这篇博客:http://www.ibm.com/developerworks/cn/education/java/j-nio/

之后的学习笔记实在学习完该博客内容的基础上,部分地方加上自己的一点理解而整理出来的,如有错误,请以原博客为准。


I/O简介发

    在Java编程中,原先一直使用的是基于流的I/O。所有I/O都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。而JDK1.4开始出现的NIO,与原来的I/O有着同样的作用和目的,但是它使用不同的方式。NIO是基于块的I/O方式来进行的,所以块I/O的效率可以比流I/O高得多。

流与块的比较

    原来的 I/O 库与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。“面向流”的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。不利的一面是,面向流的 I/O 通常相当慢。

    一个“面向块”的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。

通道和缓冲区概述

    “通道”和“缓冲区“是NIO 中的核心对象。通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象。一个 Buffer 实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。

缓冲区概念

    在面向流的I/O只给你,一般是将数据直接写入或者将数据读到Stream对象中,在NIO中,所有数据都是使用缓冲区处理,即Buffer是一个缓冲区对象,其包含了一些要写入或者刚读出的数据。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。缓冲区实质上是一个数组,但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。

缓冲区类型

  • ByteBuffer(最常用)
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

    在NIO中,Buffer是一个接口,每个具体的Buffer类都是Buffer接口的实例。

通道概念

    在NIO中我们通过通道来读取和写入数据,所有的数据是通过Buffer对象来处理的,我们不会将一个字节直接写入通道,而是先写入缓冲区,同样也不会从通道中直接读取自己,而是将数据从通道中读入缓冲区,再从缓冲区读取字节。

通道类型

    通道与流的不同之处在于,通道是双向的,既可以用来读,也可以用来写或者同时用来读写,而流是只在一个方向上的,分为输入流和输出流。


猜你喜欢

转载自blog.csdn.net/lzx_longyou/article/details/51967887
今日推荐