`

java nio Buffer 中 compact的作用

 
阅读更多

java nio Buffer 中 compact的作用

该方法的作用是将 position 与 limit之间的数据复制到buffer的开始位置,复制后 position  = limit -position,limit = capacity

但如果position 与limit 之间没有数据的话发,就不会进行复制

下面举个例子:

将数据从一个channel 读取出来,然后写入另外一个channel 

ByteBuffer buffer  = ByteBuffer.allocate(4);

 

while((len=channelSrc.read(buffer))>0) {
	    buffer.flip();
	    channelDes.write(buffer);
	    // 此时write并不一定一次把buffer中的数据全部发送出去,再次写数据的时候,我们
	    //要将 postion
	    System.out.println("read "+len+" bytes");
	}*
如果上面写的,channel 是一种非阻塞 io 操作,write操作并不能一次将buffer 中的数据全部写入到指定的 channel 中去,但如果一次写不完的话

 

那么第二次再读取的时候,我们就要将 position = limit ,limit = capacity ,然后再读取,不然第二次读取的数据会把第一次没有write 完的数据覆盖掉,

等设置后第二次读取完成后,我们还是要向channel 中write 数据,然后这次写入数据还要从上一次没有写完的地方开始写,我们还要将position 还原到上一步记录的地方

然后将limit 设置成 最后一次 position 的位置,这样做在复杂,因此提供了一个 compact 操作,我们在 write 后,执行 buffer.compact()将没有发出的数据复制到 buffer 

的开始位置,posittion = limit-position,limit = capacity,这样在下一次read(buffer)的时候,数据就会继续添加到缓冲的后面了

;因此标准的从一个channel 的数据到另一个 channel 的操作是这样的

while(channelread.read(buffer)>0 || buffer.position ==0){

buffer.flip();

channelwriter.write(buffer);

buffer.compact();

}

分享到:
评论

相关推荐

    Java NIO Buffer过程详解

    Java NIO Buffer 是 Java NIO 中的一种重要组件,负责数据的存储和传输。缓冲区是数组,用于存储不同数据类型的数据。在与 NIO 通道交互时,Java NIO Buffer plays a crucial role. 基本缓冲区用法: 1. 写入数据...

    JAVA-NIO-DEMO

    - **Buffer操作**:展示如何创建、填充、清空和读取缓冲区,以及如何使用`flip()`、`clear()`和`compact()`方法管理缓冲区状态。 - **选择器使用**:通过Selector监听多个通道的就绪状态,实现多路复用,提高程序...

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

    在Java NIO中,Buffer类是所有其他缓冲类的基类,为所有缓冲器类型提供了通用方法。下面详细说明Java NIO中的主要类和方法。 Buffer类(C.1.1): Buffer类是一个抽象类,提供了缓冲区操作的基本结构。以下是一些...

    Java NIO原理分析及代码实例

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

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

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO(Block I/O)模型不同,NIO提供了更高效的数据处理方式,特别适合于高并发、大数据量的网络应用。在Java NIO流篇1的学习中,我们将深入...

    Java NIO非阻塞服务端与客户端相互通信

    - **Buffer的管理**:读写前后需要管理缓冲区,如flip()、clear()或compact()等方法用于改变缓冲区的读写位置。 5. **多路复用与选择器** - **多路复用**:一个选择器可以管理多个通道,这意味着单线程可以处理多...

    nio_javanio_NIO_

    本文将深入探讨Java NIO的核心概念、主要组件以及如何在实际应用中使用。 1. **通道(Channel)与缓冲区(Buffer)** - **通道(Channel)**:在NIO中,数据的读写都是通过通道进行的。通道类似于流,但具有双向性,...

    java nio操作

    NIO的集成性也非常好,原生的java.io.*包已经基于NIO进行了重写,使得即使在面向流的系统中也能利用NIO的性能优势。同时,NIO库也可以实现标准I/O功能,提供更多的可能性。 总的来说,Java NIO提供了更高效、更灵活...

    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)**:通道类似于...

    Java-NIO-Programming-Cookbook(含源码)

    Java NIO(非阻塞I/O)编程是Java平台中的一种高效I/O处理方式,相比传统的BIO(阻塞I/O),NIO提供了更灵活、性能更高的数据传输机制。本书《Java NIO Programming Cookbook》旨在深入浅出地介绍如何利用Java NIO...

    Java NIO学习笔记——ByteBuffer用法

    本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...

    Java IO_NIO

    Java NIO是在Java 1.4版本中引入的新IO模型,主要特点是其非阻塞特性。NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。通道是数据传输的途径,如文件通道、网络通道等;缓冲区是存储数据...

    Java NIO中四大核心组件的使用详解

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O 不同,NIO提供了非阻塞的数据读写方式,提高了应用在高并发环境下的性能。NIO的核心组件包括通道(Channel)、缓冲区(Buffer...

    详细了解JAVA NIO之Buffer(缓冲区)

    JAVA NIO之Buffer(缓冲区)是Java NIO中一个重要的概念,它提供了一种高效的数据处理方式。缓冲区是一个可以写入数据然后从中读取数据的内存块,它被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块...

    JAVA NIO学习笔记.docx

    Buffer是NIO中数据读写的基础,它是一个连续的内存块,可以用来临时存储数据。Buffer有多种状态,如`clear()`、`flip()`和`compact()`,用于数据的准备、读写和整理。Channel则负责数据的传输,可以向Buffer填充...

    Java-NIO-系列教程

    Java NIO 中有多种 Buffer 类型,分别对应不同的数据类型: - **ByteBuffer** - **CharBuffer** - **DoubleBuffer** - **FloatBuffer** - **IntBuffer** - **LongBuffer** - **ShortBuffer** 每种 Buffer 都提供了...

    java nio不错的学习资料

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O(BIO)模型的新技术。它在Java 1.4版本中被引入,极大地提升了Java处理I/O操作的效率,尤其是在高并发、大数据...

    JAVANIO简介.pdf

    ### JAVANIO简介 #### 一、基本概念与传统IO 在计算机科学领域中,**IO(Input/Output)**是指主存与外部设备(如硬盘、终端、网络等)之间传输数据的过程。它是操作系统的一项核心功能,通过专用的I/O指令来实现。...

    javaNIO学习笔记

    - **compact()**:清除 Buffer 已读数据,未读取数据移动到 position = 0 处,position 值为未读取数据长度 + 1,写入时不会覆盖未读取数据。 - **mark()**:标记一个特定的 position,可用于在特定时候恢复到特定...

    java nio ppt

    Java NIO支持面向缓冲区的(Buffer-oriented)、基于通道的IO操作。它包括在socket和文件IO中的非阻塞IO。NIO的引入主要是为了解决传统IO(即BIO)中高并发时的性能问题,因为NIO采用的是基于缓冲区和基于通道...

Global site tag (gtag.js) - Google Analytics