0 0

【Java】 NIO中的channel为什么使用buffer读写,不是使用stream?0

如题,一直搞不懂,为什么一定会设计为使用buffer?
2013年6月20日 21:27

1个答案 按时间排序 按投票排序

0 0

Channel是一个对象,可以通过它读取和写入数据。拿 NIO 与原来的 I/O 做个比较,通道就像是流,而且他们面向缓冲区的。
正如前面提到的,所有数据都通过 Buffer 对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。
通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类), 而 通道 可以用于读、写或者同时用于读写。
因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在 UNIX 模型中,底层操作系统通道是双向的。
缓冲区(ByteBuffer Get/put,压缩,查看;分配,包装
MappedByteBuffer 映射到文件的字节缓冲区
CharBuffer Get/put,压缩;分配,包装
DoubleBuffer ' '
FloatBuffer ' '
IntBuffer ' '
LongBuffer ' '
ShortBuffer ' '
ByteOrder 字节顺序的类型安全的枚举

是一个固定数据量的指定基本类型的数据容器。除内容之外,缓冲区还具有位置 和界限,其中位置是要读写的下一个元素的索引,界限是第一个应该读写的元素的索引。基本 Buffer 类定义了这些属性以及清除、反转 和重绕 方法,用以标记 当前位置,以及将当前位置重置 为前一个标记处。
每个非布尔基本类型都有一个缓冲区类。每个类定义了一系列用于将数据移出或移入缓冲区的 get 和 put 方法,用于压缩、复制 和切片 缓冲区的方法,以及用于分配 新缓冲区和将现有数组包装 到缓冲区中的静态方法。
因为字节缓冲区可以用作 I/O 操作的源缓冲区和目标缓冲区,所以可以对它们加以区分。它们还支持其他缓冲区类所没有的几个特性:
可以将字节缓冲区分配为一个直接 缓冲区,在这种情况下,Java虚拟机将最大限度地直接在缓冲区上执行本机 I/O 操作。
可以通过 mapping 将文件区域直接包装到内存中来创建字节缓冲区,在这种情况下,可以使用 MappedByteBuffer 类中定义的几个其他文件相关的操作。
字节缓冲区提供了对其内容的访问(其内容作为任何非布尔基本类型的异类或同类二进制数据序列),访问要么是以 big-endian字节顺序进行,要么是以 little-endian 字节顺序进行。
除非另有说明,否则向此包的任何类或接口中的构造方法或方法传递 null变量,都会抛出 NullPointerException。

2013年6月21日 09:15

相关推荐

    java NIO详细教程

    - **缓冲区(Buffer)**:缓冲区是Java NIO中数据读写的基础单元。根据数据类型的不同,Java NIO 提供了多种缓冲区: - **ByteBuffer**:用于基本字节数据的缓冲。 - **CharBuffer**:用于字符数据的缓冲。 - **...

    java nio示例代码

    传统的Java IO基于流(Stream)并且是阻塞的,而NIO则是基于通道(Channel)和缓冲区(Buffer)的,并且是非阻塞的。NIO的核心组件包括通道、缓冲区和选择器,这些组件共同构建了一种更灵活、更高效的数据传输模型。 1. *...

    Java NIO详解及源码下载

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...

    Java NIO教程文档

    1. **基于通道(Channel)和缓冲区(Buffer)的操作**:与标准 IO 基于字节流和字符流的操作不同,NIO 使用 Channel 和 Buffer 进行数据传输。 2. **非阻塞 IO**:NIO 支持非阻塞模式,这意味着线程可以在等待 IO 操作的...

    java io 与java nio区别

    - **Java NIO**:采用缓冲区(Buffer)的方式进行数据读写。所有的数据都会先加载到缓冲区中,再通过通道(Channel)进行读写。 #### 内存管理 - **Java IO**:每个连接都需要分配一个新的线程,这样会消耗大量的内存...

    java nio 入门

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

    JavaNio视频下载_百度云盘资源

    Channel是Java NIO中的另一个核心概念,它类似于传统的流(Stream),但功能更加强大。Channel提供了一种从文件系统、网络或其他来源传输数据的方式。与传统的Java IO不同的是,Channel可以直接与Buffer交互,从而...

    Java-NIO之Channel(通道).doc

    Java NIO 中的 Channel(通道)是连接到实体如硬件设备、文件、网络套接字等的开放连接,它能够执行多种 I/O 操作,如读取和写入。相较于传统的 Stream,Channel 提供了一些显著的优势,比如支持异步操作和双向数据...

    Java nio详细介绍 详细介绍java nio

    **Buffer** 和 **Channel** 是NIO中的两个核心概念。 1. **Buffer是什么?** - **定义**:`Buffer`是一个包含数据的对象,用于读写操作。在NIO中,所有数据的读写都需要通过`Buffer`来进行。 - **特点**:`...

    Java-NIO2教程

    Channel与Buffer结合使用,可以将数据从Channel读取到Buffer中,或将Buffer中的数据写入Channel。 - **Buffers**: Buffer是用于存储数据的一块内存区域。在NIO中,所有的I/O操作都是通过Buffer进行的。Buffer具有...

    Java NIO 在并发型服务器设计中的应用

    为了克服传统I/O的局限性,Java NIO 提供了一种全新的数据读写模型,包括 Buffer(缓冲区)、Channel(通道)、Selector(选择器)三个核心组件,这些组件共同实现了非阻塞型I/O。 - **Buffer(缓冲区)**:Buffer ...

    Java NIO原理 图文分析及代码实现

    为了更好地理解Java NIO的使用方式,下面我们通过简单的代码示例来展示如何实现一个基本的NIO服务端和客户端。 **服务端代码实现** ```java package cn.nio; import java.io.IOException; import java.net....

    java NIO 详细讲解

    NIO中的Channel类似于传统IO中的Stream,但提供了更高效的处理方式。 - **缓冲区(Buffer)**:用于存储待处理的数据。在读取或写入数据时,都需要通过Buffer来操作。Buffer提供了一种结构化的数据访问方式,并且可以...

    java nio操作

    在NIO中,有两个核心概念:**通道(Channel)**和**缓冲区(Buffer)**。通道是数据传输的路径,可以从一个源头读取数据,或者向一个目的地写入数据。通道类似于流,但它们是双向的,可以同时读写。Java中常见的通道...

    nio.rar_Java socketA_java nio_java socket a

    在Java Socket API中,传统的阻塞I/O基于流(Stream-based)模型,而NIO基于通道(Channel-based)和缓冲区(Buffer-based)模型。以下是Java NIO在Socket通信中的关键知识点: 1. **通道(Channel)**:通道类似于...

    NIO.rar_NIO_java nio

    而NIO引入了通道(Channel)和缓冲区(Buffer)的概念,并支持非阻塞I/O操作,使得数据可以从通道直接读入到缓冲区,或者从缓冲区直接写入到通道,实现了双向数据传输,并且可以同时处理多个连接。 在这个"NIO.rar_NIO_...

    java-nio.rar_NIO_java nio

    传统的Java IO基于流(Stream)和缓冲区(Buffer)进行操作,而NIO则引入了通道(Channel)和选择器(Selector)的概念,使得多路复用变得更加容易,从而在处理大量并发连接时表现出更高的性能。 在NIO系统中,数据...

    Java NIO入门

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库在1.4版本引入的一个重要特性,旨在提供一种更高效的数据处理方式,尤其是在高并发、大吞吐量的场景下。传统的Java I/O基于流(Stream)...

Global site tag (gtag.js) - Google Analytics