`
youyu4
  • 浏览: 440166 次
社区版块
存档分类
最新评论

java NIO 之 Scatter/Gather

 
阅读更多

java NIO 之 Scatter/Gather

 

      Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(通道)中读取或者写入到Channel的操作。

 

  • 分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。
  • 聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。

scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。

 

 

 

 

Scattering Reads

 

Scattering Reads是指数据从一个channel读取到多个buffer中。如下图描述:


        
 

代码如下:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);
 
ByteBuffer[] bufferArray = { header, body };
 
channel.read(bufferArray);

 

 

注意:buffer首先被插入到数组,然后再将数组作为channel.read() 的输入参数。read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写。

 

Scattering Reads在移动下一个buffer前,必须填满当前的buffer,这也意味着它不适用于动态消息(译者注:消息大小不固定)。换句话说,如果存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Reads才能正常工作。

 

 

 

 

Gathering Writes

 

Gathering Writes是指数据从多个buffer写入到同一个channel。如下图描述:


        
 

代码如下:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);
 
//write data into buffers

ByteBuffer[] bufferArray = { header, body };
 
channel.write(bufferArray);

 

 

    buffers数组是write()方法的入参,write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel中。因此与Scattering Reads相反,Gathering Writes能较好的处理动态消息。

 

 

 

  • 大小: 7.4 KB
  • 大小: 6.9 KB
分享到:
评论

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程...

    【Java NIO 简例】分散(Scatter) – 聚集(Gather)

    原文:《Java NIO Scatter / Gather》 Scatter(分散):将一个 Channel 中的数据读取到多个 Buffer 中。 Gather(聚集):将多个 Buffer 中的数据写入一个 Channel 中。 Scatter/Gather 机制可以方便处理多个分开的...

    Java NIO Ron Hitchens著

    8. **scatter/gather I/O**:scatter/gather是指在一次操作中,可以从多个缓冲区读取数据(scatter),或者将数据写入到多个缓冲区(gather),提高了数据处理的效率。 9. **文件系统事件(WatchService)**:Java ...

    Java NIO (中英版)

    7. ** Scatter/Gather(分散/聚集)**:NIO支持Scatter/Gather读写,即可以从多个缓冲区分散读取数据,也可以向多个缓冲区聚集写入数据,这在处理大块数据时非常有用。 8. **内存映射文件(Memory-Mapped Files)**...

    java NIO 中文开发文档

    - **scatter/gather I/O**:scatter/gather允许数据从多个缓冲区写入通道,或者从通道读取到多个缓冲区,提高了数据处理的灵活性。 Java NIO适用于高性能服务器端和客户端应用,例如在处理高并发连接的网络服务器中...

    Java.NIO资源下载资源下载

    - **散列/收集 (Scatter/Gather)**:解释了如何使用 Channel 进行散列/收集操作,这是一种优化读写操作的技术。 - **FileChannel**:详细讨论了 FileChannel 的使用场景及其特点。 - **内存映射文件 (Memory-Mapped ...

    高手使用Java NIO编写高性能的服务器

    7. **scatter/gather(分散/聚集)**:NIO允许数据从多个缓冲区分散写入一个通道,或者从一个通道聚集读入多个缓冲区,这对于处理多个小数据块的传输非常有效。 8. **异步文件操作**:Java NIO2(Java 7引入)引入...

    java nio

    7. ** Scatter/Gather(分散/聚集)**:这是NIO提供的另一种高效I/O技术。通过scatter操作,可以从多个缓冲区分散读取数据;通过gather操作,可以将多个缓冲区的数据聚集写入。 在实际开发中,Java NIO常用于高并发...

    Java NIO原理分析及代码实例

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

    Java NIO系列教程

    - **Scatter/Gather**:允许数据从多个缓冲区写入通道,或从通道读取数据到多个缓冲区中。 - **FileLocks**:用于文件锁定的机制,确保文件的安全访问。 #### 总结 Java NIO 通过引入 Channels、Buffers 和 ...

    NIO入门pdf分享

    7. **scatter/gather传输**:NIO支持scatter/gather传输,即数据可以从多个缓冲区写入通道,也可以从通道分散读取到多个缓冲区,这对于处理多个数据源和目标非常有用。 8. **管道(Pipe)**:NIO引入了管道,允许两个...

    Java NIO入门

    教程可能还会深入讲解NIO的高级特性,如scatter/gather(分散/聚集)读写,以及如何使用`Selector`进行多路复用。通过学习这个教程,开发者可以更好地理解和掌握Java NIO,从而在实际项目中有效提升程序的性能和并发...

    nioserver.rar_NIO_java nio

    此外,NIO还提供了scatter/gather读写功能,即数据可以从多个缓冲区写入通道,或者从通道分散读取到多个缓冲区,这对于处理大块数据非常有用。管道(Pipe)则提供了一个单向数据流,可以用于线程间通信。 总的来说...

Global site tag (gtag.js) - Google Analytics