`

java nio缓冲器(转)

阅读更多

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

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

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

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

  capacity:缓冲器的容量;

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

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

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

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

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

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

 

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

 

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

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

 

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

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

 

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

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

 

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

 

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

 

转博地址:http://shmily2038.iteye.com/blog/1741807

分享到:
评论

相关推荐

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    Java NIO英文高清原版

    6. **多路复用器(Multiplexing)**:Java NIO的选择器实现了I/O多路复用,即单个线程可以同时处理多个连接,这在处理大量并发连接时非常有用。 7. **管道(Pipe)**:管道是两个线程间进行单向数据传输的通道。一...

    java NIO 视频教程

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

    基于Java NIO反应器模式设计与实现

    Java NIO的反应器模式设计与实现,首先涉及到理解Java NIO的基本概念,如通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。通道是进行读写操作的基础,是连接I/O源和数据的端点。缓冲区是在NIO中用于数据...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    一个java NIO的例子

    而Java NIO引入了选择器(Selector)和通道(Channel)的概念,允许单个线程同时处理多个连接,大大提高了系统在高并发环境下的性能。 本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何...

    java nio 读文件

    NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高的效率。在本篇文章中,我们将深入探讨Java NIO如何读取文件。 一、NIO的基本概念 1. 缓冲区(Buffer):NIO的...

    Java NIO测试示例

    Java NIO提供了ByteBuf、CharBuf、ShortBuf、IntBuf、LongBuf、FloatBuf和DoubleBuf等不同类型的缓冲区,它们都有统一的API,如put()用于写入数据,get()用于读取数据,clear()用于清空缓冲区,flip()用于切换读写...

    Java NIO Socket基本

    缓冲区类型包括ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,它们都继承自`java.nio.Buffer`。 3. **选择器(Selector)**:用于监听多个通道的事件(如连接就绪、数据到达等),当某个通道准备好进行读写...

    java nio 实现socket

    ### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...

    java nio入门学习,两个pdf

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作...

    java nio示例代码

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

    JAVA NIO学习网站

    在Java传统IO中,数据的读写都是通过流来完成,而NIO则引入了通道(Channel)和缓冲区(Buffer)的概念,提供了一种非阻塞的I/O操作方式,极大地提高了Java进行并发I/O处理的能力。 首先,我们来看下NIO的核心组件...

    Java NIO 中英文版

    - **选择器**:Java NIO中的选择器允许单个线程监控多个通道,当这些通道准备进行读写操作时,选择器会通知线程,从而提高了多路复用的能力,有效利用了系统资源。 3. **文件系统操作** - Java NIO提供了一组文件...

Global site tag (gtag.js) - Google Analytics