Java NIO 入门(二)Channels and buffers(通道和缓冲)
guibin.beijing@gmail.com
概述
Channel和Buffer是NIO中最核心的对象,他们用在几乎每一个NIO的操作上。
Channel模拟了老IO包中的流的概念。所有去任何地方(或者来自任何地方)的数据都必须通过Channel对象。
Buffer本质上说是一个容器对象。任何发送到Channel的数据都必须先放进Buffer,类似的,任何从Channel中读出的数据都先读进Buffer。
在本节中你将学会在NIO中使用Channel和Buffer。
什么是Buffer?
Buffer就是一个装载数据的容器对象,数据从Buffer中读出,或者把数据写入Buffer中。在NIO中添加了Buffer对象,这是NIO和老IO最重要的区别。在面向流的I/O中,你可以把数据直接写入Stream对象,或者直接把数据从Stream中读出来,而不需要任何容器。
Buffer本质上就是一个数组(array)。通常它是一个字节数组,或者其他种类的可用数组。但是Buffer除了是一个数组之外,它还提供了结构化的访问数据的方法,并且还用来跟踪系统的读/写过程。
Buffer的种类
最通常使用的Buffer是ByteBuffer。ByteBuffer允许get/set(也就是读取/写入字节)操作底层的字节数组。
ByteBuffer不是NIO中唯一的buffer,实际上对每种JAVA原生类型都对应一个相应的Buffer。
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
每种类型的Buffer类都是Buffer接口的一个实例。除了ByteBuffer之外,每个Buffer都有完全一样的操作,区别仅仅在于他们操作的数据类型。因为ByteBuffer用于绝大多数标准的I/O操作,它除了具有其他类型Buffer共有的操作之外,还有一些个性的操作。
什么是Channel?
Channel是这样一个对象:你可以从Channel中读取数据,并且你也可以从Channel中写入数据。NIO与老的IO相比而言,Channel就如同Stream。
就像之前提到的,
所有被NIO处理的数据都必须通过Buffer对象,而不能直接将任何字节写入Channel;而是必须先将数据写入Buffer。Buffer中可以包含少到一个字节,多到任何字节数目。相似的,也不能直接从Channel中读取任何字节,必须首先通过Channel将数据读入Buffer,然后再从Buffer中获取数据。
Channel的种类
Channel与Stream的区别在于:
Channel是双向的,而Stream只能是单向的(Stream必须是InputStream或者OutpugStream的一个子类,即要么是输入流,要么是输出流,不能即输入又输出),而
Channel再被打开之后,即可以读,也可以写,或者同时进行读写操作。
因为Channel是双向的,因此它比Stream更好的反应了底层操作系统IO的实质。特别是在Linux系统中,底层操作系统都是双向的。
本文参考自
http://www.cs.brown.edu/courses/cs161/papers/j-nio-ltr.pdf
分享到:
相关推荐
Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 ...
Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、套接字和UDP通信。 2. **缓冲区(Buffers)**:缓冲区是存储数据的主要对象,所有的I/O操作都是通过缓冲区进行的...
NIO的核心在于通道(Channels)和缓冲区(Buffers)的概念,与传统的流(Streams)有所不同。 1. **通道(Channels)**: 通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的...
#### 二、Channels and Buffers (通道和缓冲区) - **通道(Channel)**:Java NIO 中的通道主要有以下几种实现形式: - **FileChannel**:用于文件的读写操作。 - **DatagramChannel**:用于 UDP 数据报的发送和...
Java NIO 主要包括三大核心组成部分:Channels、Buffers 和 Selectors。 #### Java NIO Channels - **定义**:通道(Channel)是 Java NIO 中的重要组成部分,它可以理解为一种双向的数据流,支持从通道读取数据到...
Java NIO的核心组件主要包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors): - **通道(Channels)**:通道是数据传输的途径,类似于传统IO中的流。Java NIO提供了多种通道,如FileChannel用于文件...
- **Java Channels and Buffers** IBM教程: 提供的`.chm`文件可能包含详细的NIO通道和缓冲区的使用示例和解析,对于深入学习NIO非常有帮助。 通过深入理解并熟练掌握Java NIO,开发者可以构建出更高效、更灵活的I/...
#### 二、Java NIO关键组件 Java NIO的核心组件包括: - **Channels**:用于表示IO源或目标的一个连接点。 - **Buffers**:用来存储数据的对象,是数据传输的载体。 - **Selectors**:多路复用器,用于监控多个...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...
NIO的核心在于通道(Channels)和缓冲区(Buffers)的概念,它们与传统的流(Streams)模型不同,允许进行异步读写,从而提高了程序性能。 1. **通道(Channels)**:通道类似于流,但有以下几个关键区别: - 双向...
在Java NIO中,数据是以通道(Channels)和缓冲区(Buffers)的形式进行传输,而不是直接通过流。这种设计使得NIO能够同时处理多个输入/输出操作,从而实现多路复用。 标题“nio.rar_NIO_NIO-socket_java nio_java ...
而Java NIO则引入了选择器(Selectors)和通道(Channels)等概念,提供了更高效、灵活的I/O操作方式。 1. **通道(Channels)与缓冲区(Buffers)** - **通道**:Java NIO中的通道类似于流,但它们是双向的,可以...
- **通道(Channels)**:Java NIO 提供了多种通道,如文件通道、套接字通道等,它们代表不同类型的I/O操作。 - **缓冲区(Buffers)**:数据在通道和应用程序之间传输时会存储在缓冲区中,缓冲区提供了更有效率的...
#### 二、Channels 和 Buffers 在Java NIO中,所有IO操作都是从Channel开始的。Channel类似于传统的流,但它提供了更多的功能和灵活性。数据可以从Channel读取到Buffer中,也可以从Buffer写入到Channel中。 - **...
NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。下面将详细介绍这些组件以及如何构建一个基本的Java NIO服务器。 1. **通道(Channels)**:通道是数据传输的途径,类似于BIO中的流...
NIO的核心概念包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。它允许多个输入/输出操作同时进行,实现了非阻塞I/O。 零拷贝(Zero-Copy)是计算机系统中提高数据传输效率的一种技术,它避免了在...
传统的Java I/O基于字节流和字符流,而NIO则提供了通道(Channels)和缓冲区(Buffers)的概念,以及非阻塞I/O操作的能力。本资料"java-nio.rar"主要探讨的是如何使用Java NIO实现异步连接池,这在高并发场景下尤其...