NIO - Scatter/Gather

2024-05-01 17:38
文章标签 nio gather scatter

本文主要是介绍NIO - Scatter/Gather,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ZZ:http://blog.csdn.net/java2000_wl/article/details/7619395

1.Scatter  从一个Channel读取的信息分散到N个缓冲区中(Buufer).

2.Gather  将N个Buffer里面内容按照顺序发送到一个Channel.  

    Scatter/Gather功能是通道(Channel)提供的  并不是Buffer,

Scatter/Gather相关接口 类图

    ReadableByteChannel WritableByteChannel     接口提供了通道的读写功能

    ScatteringByteChannel  GatheringByteChannel接口都新增了两个以缓冲区数组作为参数的相应方法

   以FileChannel为例

   *Scatter

[java]  view plain copy print ?
  1.        /** 
  2.  * Scatter 
  3.  * <br>------------------------------<br> 
  4.  * @param fileName 
  5.  * @throws IOException 
  6.  * @see FileChannel.read(java.nio.ByteBuffer[]) 
  7.  */  
  8. private static void scatter(final String fileName) throws IOException {  
  9.     RandomAccessFile accessFile = new RandomAccessFile(fileName, "r");  
  10.     //获取文件通道  
  11.     FileChannel channel = accessFile.getChannel();  
  12.     //创建两个缓冲区  
  13.     ByteBuffer headBuffer = ByteBuffer.allocate(2);  
  14.     ByteBuffer bodyBuffer = ByteBuffer.allocate(1024);  
  15.       
  16.     ByteBuffer[] allBuffers = new ByteBuffer[]{headBuffer, bodyBuffer};  
  17.     // headBuffer 前10个字节  
  18.     // bodyBuffer 剩下的   
  19.     long n = channel.read(allBuffers);  
  20.     System.out.println("共读到多少字节:" + n);  
  21.       
  22.     headBuffer.flip();  
  23.     //head缓冲区中的数据:qw  
  24.     System.out.println("head缓冲区中的数据:" + charset.decode(headBuffer));  
  25.       
  26.     bodyBuffer.flip();  
  27.     //body缓冲区中的数据:ertyuiop  
  28.     System.out.println("body缓冲区中的数据:" + charset.decode(bodyBuffer));  
  29.     accessFile.close();  
  30.     channel.close();  
  31. }  
  32.   
  33. /** 
  34.  * Scatter2 
  35.  * <br>------------------------------<br> 
  36.  * @param fileName 
  37.  * @throws IOException 
  38.  * @see FileChannel.read(java.nio.ByteBuffer[], int, int) 
  39.  */  
  40. private static void scatter2(final String fileName) throws IOException {  
  41.     RandomAccessFile accessFile = new RandomAccessFile(fileName, "r");  
  42.     //获取文件通道  
  43.     FileChannel channel = accessFile.getChannel();  
  44.     //创建五个缓冲区  
  45.     ByteBuffer headBuffer = ByteBuffer.allocate(2);  
  46.     ByteBuffer bodyBuffer1 = ByteBuffer.allocate(3);  
  47.     ByteBuffer bodyBuffer2 = ByteBuffer.allocate(2);  
  48.     ByteBuffer bodyBuffer3 = ByteBuffer.allocate(2);  
  49.     ByteBuffer bodyBuffer4 = ByteBuffer.allocate(1);  
  50.       
  51.     ByteBuffer[] allBuffers = new ByteBuffer[]{  
  52.             headBuffer,   
  53.             bodyBuffer1, bodyBuffer2,  
  54.             bodyBuffer3, bodyBuffer4,};  
  55.     //0从那个缓冲区开始被使用    使用3个缓冲区  
  56.     //会使用 headBuffer,bodyBuffer1,bodyBuffer2  
  57.     long n = channel.read(allBuffers, 03);  
  58.       
  59.     System.out.println("共读到多少字节:" + n);  
  60.       
  61.     headBuffer.flip();  
  62.     //head缓冲区中的数据:qw  
  63.     System.out.println("head缓冲区中的数据:" + charset.decode(headBuffer));  
  64.       
  65.     bodyBuffer1.flip();  
  66.     //body1缓冲区中的数据:ert  
  67.     System.out.println("body1缓冲区中的数据:" + charset.decode(bodyBuffer1));  
  68.       
  69.     bodyBuffer2.flip();  
  70.     //body2缓冲区中的数据:yu  
  71.     System.out.println("body2缓冲区中的数据:" + charset.decode(bodyBuffer2));  
  72.       
  73.     bodyBuffer3.flip();  
  74.     //body3,没有数据  
  75.     System.out.println("body3缓冲区中的数据:" + charset.decode(bodyBuffer3));  
  76.       
  77.     bodyBuffer4.flip();  
  78.     //body4没有数据  
  79.     System.out.println("body4缓冲区中的数据:" + charset.decode(bodyBuffer4));  
  80.       
  81.     accessFile.close();  
  82.     channel.close();  
  83. }  
  84.   
  85. /** 
  86.  * 
  87.  * <br>------------------------------<br> 
  88.  * @param fileName 
  89.  * @throws IOException 
  90.  */  
  91. private static void writeData(final String fileName, String data) throws IOException {  
  92.     RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");  
  93.     accessFile.writeBytes(data);  
  94.     accessFile.close();  
  95. }  
[java]  view plain copy print ?
  1. private static Charset charset = Charset.forName("GBK");  
  2.   
  3. public static void main(String[] args) throws IOException {  
  4.     final String fileName = "D:/test.log";  
  5.     //先写入10个字节数据 以便测试 scatter模式  
  6.     writeData(fileName, "qwertyuiop");  
  7.       
  8.     /**----------Scatter------------*/  
  9.     //read(java.nio.ByteBuffer[])  
  10.     scatter(fileName);  
  11.       
  12.     //read(java.nio.ByteBuffer[], int, int)  
  13.     scatter2(fileName);  
  14. }  

*Gather

[java]  view plain copy print ?
  1. /** 
  2.  * gather 
  3.  * <br>------------------------------<br> 
  4.  * @param fileName 
  5.  * @throws IOException  
  6.  * @see FileChannel#write(java.nio.ByteBuffer[]) 
  7.  */  
  8. private static void gather(String fileName) throws IOException {  
  9.     RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");  
  10.     //获取文件通道  
  11.     FileChannel channel = accessFile.getChannel();  
  12.     //创建两个缓冲区  
  13.     ByteBuffer headBuffer = ByteBuffer.allocate(3);  
  14.     headBuffer.put("abc".getBytes());  
  15.       
  16.     ByteBuffer bodyBuffer = ByteBuffer.allocate(1024);  
  17.     bodyBuffer.put("defg".getBytes());  
  18.       
  19.     ByteBuffer[] allBuffers = new ByteBuffer[]{headBuffer, bodyBuffer};  
  20.       
  21.     headBuffer.flip();  
  22.     bodyBuffer.flip();  
  23.       
  24.     //将按allBuffers顺序  写入abcdefg  
  25.     long n = channel.write(allBuffers);  
  26.       
  27.     System.out.println("共写入多少字节:" + n);  
  28.       
  29.     accessFile.close();  
  30.     channel.close();  
  31. }  
  32.   
  33. /** 
  34.  * gather2 
  35.  * <br>------------------------------<br> 
  36.  * @param fileName 
  37.  * @throws IOException  
  38.  * @see FileChannel#write(java.nio.ByteBuffer[], int, int) 
  39.  */  
  40. private static void gather2(String fileName) throws IOException {  
  41.     RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");  
  42.     //获取文件通道  
  43.     FileChannel channel = accessFile.getChannel();  
  44.     //创建两个缓冲区  
  45.     ByteBuffer headBuffer = ByteBuffer.allocate(3);  
  46.     ByteBuffer bodyBuffer1 = ByteBuffer.allocate(4);  
  47.     ByteBuffer bodyBuffer2 = ByteBuffer.allocate(20);  
  48.     ByteBuffer bodyBuffer3 = ByteBuffer.allocate(20);  
  49.     ByteBuffer bodyBuffer4 = ByteBuffer.allocate(20);  
  50.       
  51.     headBuffer.put("abc".getBytes());  
  52.     bodyBuffer1.put("defg".getBytes());  
  53.     bodyBuffer2.put("bnbnbnb".getBytes());  
  54.     bodyBuffer3.put("zzz444".getBytes());  
  55.       
  56.     ByteBuffer[] allBuffers = new ByteBuffer[]{  
  57.             headBuffer,   
  58.             bodyBuffer1, bodyBuffer2,  
  59.             bodyBuffer3, bodyBuffer4,};  
  60.       
  61.     headBuffer.flip();  
  62.     bodyBuffer1.flip();  
  63.     bodyBuffer2.flip();  
  64.     bodyBuffer3.flip();  
  65.     bodyBuffer4.flip();  
  66.       
  67.     //将按allBuffers数组顺序使用两个缓冲区  
  68.     //0从哪开始  
  69.     //2使用几个  
  70.     //当前使用headBuffer  bodyBuffer1  
  71.     //最终写入abcdefg  
  72.     long n = channel.write(allBuffers, 02);  
  73.       
  74.     //应该返回7个字节  
  75.     System.out.println("共写入多少字节:" + n);  
  76.       
  77.     accessFile.close();  
  78.     channel.close();  
  79. }  
[java]  view plain copy print ?
  1. private static Charset charset = Charset.forName("GBK");  
  2.   
  3. public static void main(String[] args) throws IOException {  
  4.     final String fileName = "D:/test.log";  
  5.     /**----------Gather------------*/  
  6.     //FileChannel#write(java.nio.ByteBuffer[])  
  7.     gather(fileName);  
  8.       
  9.     //FileChannel#write(java.nio.ByteBuffer[], int, int)  
  10.     gather2(fileName);  
  11. }  

这篇关于NIO - Scatter/Gather的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/952285

相关文章

还不懂BIO,NIO,AIO吗

BIO(Blocking I/O)、NIO(Non-blocking I/O)和 AIO(Asynchronous I/O)是 Java 中三种不同的 I/O 模型,主要用于处理输入 / 输出操作。 一、BIO(Blocking I/O) 定义与工作原理: BIO 即阻塞式 I/O(同步阻塞,传统IO)。在这种模型下,当一个线程发起一个 I/O 操作(如读取文件或网络数据)时,此线

JAVA NIO的笔记

Java中的NIO IO-文件的读写 NIO是Java4开始提供的用来解决IO问题的API。 Channel(通道)  Buffer(缓存区)  Selector(选择器) inputStream outPutStream 都是以Stream为观点看的 所以input为读 output为写 两个对象文件盒stream Channel读写操作都能做 Channel是执行读写操作这个工作的东西 而读写

Java高级特性增强-NIO

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每

Java - NIO之Channel(FileChannel)

一、关于Channel     Java NIO的通道(Channel)类似流,但又有些不同:         既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。         通道可以异步地读写。         通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。       Java NIO中最重要的通道的实现:

Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg

由于一次电脑蓝屏,Idea启动tomcat报错: Error:Artifact ':war exploded’: java.nio.file.InvalidPathException: Illegal char < > at index 71: K:\COMPANY_CODE_IDEA\FLOW_CODE*\target\activ : Illegal char < > at index 71:

【Python报错已解决】“ModuleNotFoundError: No module named ‘torch_scatter‘”

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言:一、问题描述1.1 报错示例:1.2 报错分析:1.3 解决思路: 二、解决方法2.1 方法一:使用pip安装torch_scatter2.2 步骤二:使用conda安装torch_scatter(如果适用) 三、其

Pytorch:Tensor的高阶操作【where(按条件取元素)、gather(查表取元素)、scatter_(查表取元素)】【可并行计算,提高速度】

一、where:逐个元素按条件选取【并行计算,速度快】 torch.where(condition,x,y) #condition必须是tensor类型 condition的维度和x,y一致,用1和0分别表示该位置的取值 import torchcond = torch.tensor([[0.6, 0.7],[0.3, 0.6]])a = torch.tensor([[1., 1.],[

Java NIO 核心知识总结

Java NIO 核心知识总结 NIO简介 在传统的I/O模型中,是以阻塞的方式进行的也就是当一个线程执行的时候线程会一直阻塞到完成工作为止。这种模型的缺点就是在并发比较大的时候性能就会比较低,并且在每次都要给一个新的任务(连接)创建一个新的线程,这个新的线程的创建和从上一个切换到这一个线程都会都性能有影响。 为了优化这个传统的io模型,在jdk1.4新引入了一个全新的new io包,在原有

Java程序员从笨鸟到菜鸟(四十三)NIO 非阻塞实现高并发

一、阻塞和非阻塞 阻塞:应用程序在获取网络数据的时候,如果网络传输很慢,就会一直等待直到传输完毕为止 非阻塞:应用程序可以直接获取已经准备就序好的数据,无需等待 二、BIO、NIO、AIO BIO(同步阻塞式 IO):服务器实现模式为一个请求一个线程,客户端有连接请求是服务器就需要启动一个线程进行处理,如果这个连接不做任何事情就造成不必要的开销 NIO(同步非阻塞式IO):服务器实现模式

第一个NIO开发演示

文章目录 Channel简介Buffer简介第一个NIO程序分析 上一篇文章 介绍了传统网络编程在处理高并发和大规模应用时通常面临性能瓶颈和资源管理问题,而 NIO 通过非阻塞 I/O 和选择器机制提供了更高效的解决方案。虽然 NIO 的 API 更复杂,但在高负载和高性能需求的场景下,它能够显著改善传统阻塞 I/O 的不足。 这篇文章, 了解下NIO的基本开发: