NIO通道和缓冲区

转载 2015年11月19日 16:23:09

本文来源于:http://www.cnblogs.com/sunwei2012/archive/2010/07/06/1772435.html

通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们。

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

在本节中,您会了解到 NIO 中通道和缓冲区是如何工作的。

什么是缓冲区? 

Buffer 是一个对象, 它包含一些要写入或者刚读出的数据。 在 NIO 中加入 Buffer 对象,体现了新库与原 I/O 的一个重要区别。在面向流的 I/O 中,您将数据直接写入或者将数据直接读到 Stream 对象中。

在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,您都是将它放到缓冲区中。

缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。 

 缓冲区类型

最常用的缓冲区类型是 ByteBuffer。一个 ByteBuffer 可以在其底层字节数组上进行 get/set 操作(即字节的获取和设置)。

ByteBuffer 不是 NIO 中唯一的缓冲区类型。事实上,对于每一种基本 Java 类型都有一种缓冲区类型:

ByteBuffer 
CharBuffer 
ShortBuffer 
IntBuffer 
LongBuffer 
FloatBuffer 
DoubleBuffer 
每一个 Buffer 类都是 Buffer 接口的一个实例。 除了 ByteBuffer,每一个 Buffer 类都有完全一样的操作,只是它们所处理的数据类型不一样。因为大多数标准 I/O 操作都使用 ByteBuffer,所以它具有所有共享的缓冲区操作以及一些特有的操作。

现在您可以花一点时间运行 UseFloatBuffer.java,它包含了类型化的缓冲区的一个应用例子。

什么是通道?

Channel是一个对象,可以通过它读取和写入数据。拿 NIO 与原来的 I/O 做个比较,通道就像是流。

正如前面提到的,所有数据都通过 Buffer 对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。 

通道类型

通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类), 而 通道 可以用于读、写或者同时用于读写。

因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在 UNIX 模型中,底层操作系统通道是双向的。 


NIO缓冲区(3)之分散(Scatter)/聚集(Gather)、通道之间的数据传输和选择器(Selector)

分散(Scatter)/聚集(Gather) 分散(scatter):从Channel中读操作时将读取的数据写入多个buffer中。即,Channel将从Channel中读取的数据“分散(scatt...

《Java NIO》:Channel and Buffer (通道和缓冲区)

《Java NIO》:Channel and Buffer (通道和缓冲区)从今天开始,自己将会了解下Java NIO的相关知识,以及会看下相关的类库源码。和往常自己学习新知识之前,自己都会阅读网...

《Java NIO》:Channel and Buffer (通道和缓冲区)

《Java NIO》:Channel and Buffer (通道和缓冲区) 从今天开始,自己将会了解下Java NIO的相关知识,以及会看下相关的类库源码。 和往常自己学习新知识之前,自己都会阅...
  • Solar24
  • Solar24
  • 2017年12月07日 17:23
  • 0

Java nio 学习笔记(一) Buffer(缓冲区)与Channel(通道)的相关知识

一.基本概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较...

(三)NIO系列之通道和缓冲区

概述 通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们。  通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 ...

Java nio 学习笔记(一) Buffer(缓冲区)与Channel(通道)的相关知识

一.基本概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的...
  • Truong
  • Truong
  • 2017年07月02日 21:25
  • 175

java NIO入门简介 Buffer(缓冲区)与Channel(通道)的相关知识

一.基本概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较...

Java nio 学习笔记(一) Buffer(缓冲区)与Channel(通道)的相关知识

一.基本概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别...

Java的NIO之详解通道Channel和字节缓冲区ByteBuffer

http://kakajw.iteye.com/blog/1788867 一. 什么是通道 I/O通道(Channel): 一种专门负责执行IO任务的处理机/处理器,具有...

Java通道方法写文件中缓冲区建立的原则

一、             字符串 1、  单个字符串givenString 单个字符串已经给定 第一步:建立字节缓冲区大小 l  使用ByteBufferbuf=ByteBuffer.alloca...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NIO通道和缓冲区
举报原因:
原因补充:

(最多只允许输入30个字)