`

java nio缓冲器

    博客分类:
  • Java
 
阅读更多

缓冲器仅仅是一个" 多功能 " 的数组。可能在这个 Buffer 类中没有体现,但是如果我们打开 ByteBuffer 的源码会有 byte[] 的数组,打开 CharBuffer 的源码会有 char[] 的数组。因为 Buffer 是所有缓冲器的父类,所以他它不能预计会有多少种缓冲器,所以索性让 " 儿子 " 们自己实现去吧

既然知道了缓冲器是一个" 多功能的数组 " ,那么我们用画图的形式来分析一下:

ByteBuffer buffer = ByteBuffer.allocate(8);//通过这句话,初始化一个byte缓冲器

 首先大家要清楚的三个关于缓冲器状态的属性:

  capacity:缓冲器的容量;

  limit:缓冲器还有多少数据能够取出或者缓冲器已存放数据了;

  position:相当于一个游标( cursor ),记录我们从哪里开始写数据,从哪里开始读数据。

还有缓冲区的两个重要的方法:

      flip() 反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为 0。如果已定义了标记,则丢弃该标记。

      clear(): 清除此缓冲区。将位置设置为 0,将限制设置为容量,并丢弃标记。

clear() 方法重设缓冲区,使它可以接受读入的数据。 flip() 方法让缓冲区可以将新读入的数据写入另一个通道。

 

// 初始化一个缓冲区
ByteBuffer buffer = ByteBuffer.allocate(8);
while (true) {
    buffer.clear();//先清理缓冲区,以便可以往缓冲区放数据  position=0 limit=8
    // 将字节序列从此通道读入给定的缓冲区。
    int r = fcin.read(buffer);
    //写入完 position为读入个数, limit为8
    if (r == -1) {
	break;
    }
    buffer.flip();//将开始读的位置position,设置为0,从头开始读,将limit写入数据的长度,设置为写入完时的position
    fcout.write(buffer);//写入完,position和limit 都为写入数据的长度
}

 

1、初始化byteBuffer,第一次clear完后的情况,如下图

position=0 limit=8  capacity表示byte缓冲区所能容纳的字节个数,表示一个容器的容纳元素的个数,想当于一个能力,不会随不同情况而变化,初始化完就是最大值。后面对这个变量不做解释。

 

2、第一次向Buffer 中写入数据后,

写入完数据后,position指向可写入数据的那个位置。 limit还是指向最大值

 

3、写入完数据后,要读取了,要先flip下

执行完flip,就表示要从byte缓冲区读取数据了,这时 position为缓冲器的开始位置,limit限制读取的数据量,故limit为读完数据的那个位置。

 

4、将缓冲器里面的数据写出完后:

 

 

读完数据时,position为数据的最大长度,limit没有变化还是数据的最大长度

 

  • 大小: 22.8 KB
5
4
分享到:
评论
6 楼 pengmj 2012-12-12  
shmily2038 写道
pengmj 写道
shmily2038 写道
天使情人 写道
NIO 的概念怎么体现!

新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的

NIO弥补的不是java执行的速度,而是线程的利用率。阻塞和非阻塞本质上都是使用了系统端口的缓存数据,NIO最重要的是使用select和通道技术,更高效的利用了执行线程,这样一个线程可以处理多个连接。

嗯,确实,不过他跟1.4之前的标准io的传输方式的本质区别:
流的流入(InputStream)和流出(OutputStream),而nio是以管道的方式进行传输,传输数据都要经过缓冲器,不过是以块的方式。
使用标准io和nio比较的典型例子:
http://www.ibm.com/developerworks/cn/java/j-zerocopy/

InputStream和OutputStream名字上听起来是动态的流,其实底层还是调用系统的缓存数据,TCP底层不是一个字节一个字节传送,而是包传递,传递过来的数据缓存在系统端口的接收缓存区内,发送也是同样的道理。
其实可以打个比喻:老的IO就好比民工去讨薪,一个个去讨;新的IO好比白领发工资,boss主动发给你。
好像又不是很恰当,呵呵,反正就这么个意思啦。
5 楼 shmily2038 2012-12-06  
pengmj 写道
shmily2038 写道
天使情人 写道
NIO 的概念怎么体现!

新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的

NIO弥补的不是java执行的速度,而是线程的利用率。阻塞和非阻塞本质上都是使用了系统端口的缓存数据,NIO最重要的是使用select和通道技术,更高效的利用了执行线程,这样一个线程可以处理多个连接。

嗯,确实,不过他跟1.4之前的标准io的传输方式的本质区别:
流的流入(InputStream)和流出(OutputStream),而nio是以管道的方式进行传输,传输数据都要经过缓冲器,不过是以块的方式。
使用标准io和nio比较的典型例子:
http://www.ibm.com/developerworks/cn/java/j-zerocopy/
4 楼 pengmj 2012-12-06  
shmily2038 写道
天使情人 写道
NIO 的概念怎么体现!

新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的

NIO弥补的不是java执行的速度,而是线程的利用率。阻塞和非阻塞本质上都是使用了系统端口的缓存数据,NIO最重要的是使用select和通道技术,更高效的利用了执行线程,这样一个线程可以处理多个连接。
3 楼 alvin198761 2012-12-06  
天使情人 写道
NIO 的概念怎么体现!

体现出来的就是nio包和类,你自己测试一下,对比速度
2 楼 shmily2038 2012-12-06  
天使情人 写道
NIO 的概念怎么体现!

新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的
1 楼 天使情人 2012-12-06  
NIO 的概念怎么体现!

相关推荐

    java NIO 视频教程

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

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

    Java NIO通道:通道基础、文件通道、Socket通道、工具类 Java NIO缓冲区:基础、缓冲区(Buffer)、创建缓冲区、直接缓冲区(DirectByteBuffer) Java NIO选择器:核心概念、选择器使用、Demo、选择器深入、

    java nio教程pdf

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

    java nio 中文版

    这些新的I/O特性主要包含在java.nio软件包及其子包中,并被命名为New I/O(NIO)。通过本书,您将学会如何使用这些令人兴奋的新特性来极大地提升Java应用程序的I/O效率。  目录 前言 第一章 简介 第二章 缓冲...

    java nio.doc

    java.nio.charset 包中定义了字符集 API,java.nio.channels 包中定义了信道和选择器 API。每个子包都具有自己的服务提供程序接口 (SPI) 子包,SPI 子包的内容可用于扩展平台的默认实现或构造替代实现。

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv...

    javasnmp源码-nio-learn:JavaNIO使用示例,NIO的使用,TCP,UDP的简单示例

    nio缓冲区buffer 简介 Buffer是数据的容器,在nio中负责数据的存取,java为不同数据类型提供了相对应的缓冲区类型 如:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 、DoubleBuffer 等...

    yubo-java-nio:java nio的学习项目

    yubo-java-nioNIO 直接缓冲区 VS 非直接缓冲区直接缓冲区1、直接缓冲区最适合I/O 2、创建成本比非直接缓冲区高 3、直接缓冲区使用的内存是通过调用原生的、操作系统特定的代码来分配的 4、内存存储区域不受限制垃圾...

    java.nio新功能的优点

    java 1.4中推出的java.nio...你能够直接从硬盘上,而不必一字节一字节地读写数据块(当你在非阅读期间将数据从缓冲器中提出时,它处理低字节优先问题。);你可以进行非阻塞异步输入/输出;你能够锁定整个或部分文件。

    java8源码-nio:java8nio使用的总结

    NIO_直接缓冲区与非直接缓冲区 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率 5. ...

    [ Java ] 最通俗易懂的 Java NIO 讲解

    文章目录IO 与 NIO 的比较通道和缓冲区缓冲区(buffer)通道(channel)使用 NIO 完成本地通信使用 NIO 完成网络通信管道 IO 与 NIO 的比较 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)...

    Java流NIO

    Java NIO(NEW IO)是从Java1.4开始引入的新版IO,用来替代标准的Java IO API NIO于原来的IO有相同的功能,但是他们之间的使用方式是完全不同的,NIO是面向缓冲区,面向通道的的IO操作,NIO拥有更加高效的进行文件...

    2021最新-Java NIO视频教程-视频教程网盘链接提取码下载 .txt

    教程内容涵盖:阻塞和非阻塞IO、Channel通道、Buffer缓冲区、Selector选择器、Pipe管道、FileLock文件锁,以及Path、Files、异步FileChannel和Charset字符编码等,并通过一个多人聊天室的综合案例,把所有的NIO知识...

    JAVA IO-NIO 详解

    NIO的核心组件包括Channel(通道)、Buffer(缓冲区)和Selector(选择器)。Channel是数据传输的通道,它替代了传统IO中的流;Buffer是数据的容器,它可以在Channel和程序之间进行数据的读写操作;Selector则用于...

    Java NIO+多线程实现聊天室

    选择器 渠道 字节缓冲区 ProtoStuff 高性能序列化 HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示...

    wifi-direct-chat:使用Java Nio通道通过wifi直接进行点对点聊天应用

    Java NIO选择器和通道。 如今,Java NIO已被包括Netty在内的许多项目广泛使用。 它提供了用于编写可伸缩服务器的无阻塞IO设施。 Java NIO提供了用于缓冲​​传入数据的缓冲机制。 通道是通过管道在两个实体之间传输...

    java7源码-java-nio-master:Java

    java7 源码 java-nio-master java Nio 主要内容: (1) 按操作方式分类结构图: (2)按操作对象分类结构图 IO流的分类: 按照流的流向分,可以分为输入流和输出流;...按照操作单元划分,可以划分为...3)NIO有选择器,而

    《NIO与Socket编程技术指南》高洪岩.zip

    非常详细地讲解了NIO中的缓冲区、通道、选择器、编码,以及使用Socket技术实现TCP/IP和UDP编程,细化到了演示全部SocketOption的特性,这对理解基于NIO和Socket技术为基础所开发的NIO框架是非常有好处的,本书以案例...

    JAVA_API1.6文档(中文)

    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...

    Java内存与垃圾回收调优.docx

    堆外内存包括直接内存、Java NIO缓冲区等。 堆内存调优: 根据应用程序的特点调整新生代和老年代的大小。例如,如果对象生命周期短,可增大Eden区大小;如果对象生命周期长,考虑增大老年代大小。 根据垃圾回收的...

Global site tag (gtag.js) - Google Analytics