`
wutao8818
  • 浏览: 616396 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

NIO 通道和缓冲区

    博客分类:
  • io
阅读更多

FROM  IBM : developerWorks 中国网站  


通道 和 缓冲区 是 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 模型中,底层操作系统通道是双向的。

分享到:
评论
1 楼 jerry 2009-03-29  
老IO和新IO的Buffer有何区别?
老IO也有缓冲,和新的缓冲有何区别

相关推荐

    nio学习demo 处理因缓冲区满导致写入失败问题

    处理因缓冲区满导致的写入失败问题则涉及到NIO的缓冲区管理和事件驱动模型。当向通道(Channel)写入数据时,如果缓冲区已满,写操作会阻塞,直到缓冲区有空间。因此,需要妥善处理这种情况,避免程序卡死。 在给定...

    Java NIO(通道+缓冲区+选择器)

    Java NIO,即Non-blocking Input/...总结来说,Java NIO通过通道、缓冲区和选择器提供了更灵活、高性能的I/O处理方式,尤其适合处理高并发和大数据传输的场景。正确理解和运用这些概念可以显著优化Java应用程序的性能。

    Java NIO 简单入门

    - **Java Channels and Buffers** IBM教程: 提供的`.chm`文件可能包含详细的NIO通道和缓冲区的使用示例和解析,对于深入学习NIO非常有帮助。 通过深入理解并熟练掌握Java NIO,开发者可以构建出更高效、更灵活的I/...

    java NIO 视频教程

    标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...

    NIO学习系列:缓冲区更多特性及分散/聚集IO

    本篇文章将深入探讨NIO中的缓冲区特性以及分散/聚集IO操作,这对于理解和优化Java程序的I/O性能至关重要。 缓冲区是NIO中处理数据的主要方式,它允许我们高效地读写数据。缓冲区在内存中分配一块区域,用于存储特定...

    尚硅谷Java视频_NIO 视频教程

    尚硅谷_NIO_直接缓冲区与非直接缓冲区 ·04. 尚硅谷_NIO_通道(Channel)的原理与获取 ·05. 尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集写入 ·07. 尚硅谷_NIO_字符集 Charset ·08. ...

    Java NIO 主要类和方法(Java NIO中文版 附录C)

    NIO的API设计考虑到了性能和灵活性,通过使用缓冲区和通道,可以让开发者更好地控制数据的处理过程,同时利用缓冲机制实现数据的批量操作。 在Java NIO中,所有的输入输出操作都围绕着Buffer和Channel这两个核心...

    深入浅出NIO

    在Java编程领域,NIO(New Input/Output)是一种用于替代标准IO模型的机制,其核心在于非阻塞的I/O操作和通道(Channel)及缓冲区(Buffer)的使用。传统的IO模型,如描述中的“阻塞I/O”,在读写数据时会一直等待...

    NIO 入门.chm,NIO 入门.chm

    2. **缓冲区(Buffer)**:缓冲区是NIO中数据存储的主要对象,它是内存块的抽象,用于在通道和应用程序之间传输数据。Java NIO提供了多种类型的缓冲区,如ByteBuffer、CharBuffer、IntBuffer、FloatBuffer等,每种...

    java NIO原理和使用

    3. **散列和聚合**:NIO 提供了对多缓冲区读写的优化,比如可以通过单个操作将多个缓冲区的数据写入通道或从通道读取到多个缓冲区。 4. **内存映射文件**:NIO 支持将文件直接映射到内存中,这在处理大数据量时特别...

    Java IO_NIO

    **Java NIO通道** Java NIO中的通道类有FileChannel、SocketChannel、ServerSocketChannel等,它们分别对应于文件、套接字和服务器套接字。通道可以进行读写操作,并且可以与缓冲区进行交互。例如,FileChannel可以...

    java NIO.zip

    NIO的核心在于通道(Channels)和缓冲区(Buffers)的概念,与传统的流(Streams)有所不同。 1. **通道(Channels)**: 通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的...

    java nio ppt

    NIO的引入主要是为了解决传统IO(即BIO)中高并发时的性能问题,因为NIO采用的是基于缓冲区和基于通道(Channel)的方式进行操作,可以通过选择器(Selectors)实现对多个通道(Channel)的管理。 NIO和传统的IO...

    nio.rar_NIO_java nio

    在Java NIO中,通道和缓冲区的组合使用使得数据传输更加高效。例如,可以一次性将缓冲区中的所有数据写入通道,或者从通道一次性读取缓冲区的全部数据,减少了数据复制的次数。 总的来说,Java NIO是一种现代的I/O...

    NIO编程实现实例

    NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。通道是数据读写的基础,它可以从一个数据源读取数据,并将其写入另一个数据源。缓冲区是存储数据的容器,它提供了对数据的高效访问。选择...

    Java语言基础教程-Java NIO流篇1

    另外,`get()`和`put()`方法分别用于读取和写入数据,`read()`和`write()`方法则用于从通道读取到缓冲区,或者将缓冲区的数据写入通道。同时,缓冲区的容量、位置和限制的管理也是这一节的重点内容。 此外,NIO还...

    Nio和Io的详细描述.docx

    Java NIO的核心组件包括通道、缓冲区和选择器。此外,NIO还有许多其他类和组件,如文件通道、套接字通道、服务器套接字通道、散列通道、管道等,它们共同构成了一个强大且灵活的IO框架,为开发者提供了处理高并发和...

    java nio示例代码

    NIO的核心组件包括通道、缓冲区和选择器,这些组件共同构建了一种更灵活、更高效的数据传输模型。 1. **通道(Channel)**:通道类似于流,但有所不同。通道可以读取和写入数据,同时它们可以是双向的,也就是说数据...

    java nio 入门

    传统IO基于流(Stream)进行数据读写,而NIO基于通道(Channel)和缓冲区(Buffer)。NIO的核心特点是它支持非阻塞I/O操作,可以显著提高程序的效率,尤其是在多路复用I/O方面。 二、NIO组件 1. **通道(Channel)**:类似...

    niodemo.zip

    与传统的阻塞I/O模型相比,NIO的核心特性包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。下面我们将详细探讨这些知识点。 1. **通道(Channels)**:在Java NIO中,数据通过通道进行传输。通道是...

Global site tag (gtag.js) - Google Analytics