您的位置 首页 > 德语词汇

scatter是什么意思(NIO之Scatter)

今天给各位分享scatter是什么意思的知识,其中也会对NIO之Scatter进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

scatter是什么意思(NIO之Scatter)

前面的文章分享了Buffer和Channel,以及关于Buffer和Channel的基本操作。这篇文章继续分享关于Channel的Buffer的操作Scatter和Gather,这篇内容比较简单。

什么是Scatter和Gather

Scatter和Gather的字面意思就可以分好的解释他们各自的用途。其中Scatter的意思是分散,Gather的意思是聚集,我们再来看一下他们是如何分散和聚集的,如下图所示

当一个Channel中的数据被多个Buffer来处理,就是分散也就是Scatter。

当多个Buffer同时向一个Channel中写数据时,就是聚集也就是Gather。

我们用FileChannel来解释如何使用Scatter和Gather。

RandomAccessFilerandomAccessFile=newRandomAccessFile(\n"/Users/yangpeng/Documents/360/code/QiwooSample/NIOSample/src/com/nio/sample/file.txt","rw");\nrandomAccessFile.seek(0);\nFileChannelfileChannel=randomAccessFile.getChannel();\nSystem.out.println("FileChannelposition"+fileChannel.position());\nByteBufferbuffer=ByteBuffer.allocate(100);\nStringstr="hello";\nbuffer.clear();\nbuffer.put(str.getBytes());\nbuffer.flip();\nByteBufferbuffer2=ByteBuffer.allocate(100);\nStringstr2="world";\nbuffer2.clear();\nbuffer2.put(str2.getBytes());\nbuffer2.flip();\nByteBuffer[]bufferArray={buffer,buffer2};\nfileChannel.write(bufferArray);\nrandomAccessFile.close();\nfileChannel.close();\n通过RandomAccessFile获得一个FileChannel分别初始化两个ByteBuffer,里面分别放入"hello"和"world"两个字符串。初始化一个ByteBuffer数组,内容为第二步的两个Buffer把ByteBuffer数组里的内容写入到FileChannel关闭RandomAccessFile和FileChannel

执行完以上几步之后,我们打开文件查看就是文本里的内容就是"helloworld"

注意:写入的是缓冲区position和limit之间的数据。如果一个缓冲区容量为10字节,但是仅有5字节的数据,那么写入到通道中的数据就是5个字节。

RandomAccessFilerandomAccessFile=newRandomAccessFile(\n"/Users/yangpeng/Documents/360/code/QiwooSample/NIOSample/src/com/nio/sample/file.txt","rw");\nrandomAccessFile.seek(0);\nFileChannelfileChannel=randomAccessFile.getChannel();\nByteBufferbuffer=ByteBuffer.allocate(5);\nByteBufferbuffer2=ByteBuffer.allocate(100);\nByteBuffer[]bufferArray={buffer,buffer2};\nfileChannel.read(bufferArray);\nbuffer.flip();\nwhile(buffer.hasRemaining()){\nSystem.out.print((char)buffer.get());\n}\nSystem.out.println("");\nbuffer2.flip();\nwhile(buffer2.hasRemaining()){\nSystem.out.print((char)buffer2.get());\n}\nrandomAccessFile.close();\nfileChannel.close();\n通过RandomAccessFile获得一个FileChannel分别初始化两个ByteBuffer,准备把数据读到这两个buffer里初始化一个ByteBuffer数组,内容为第二步的两个Buffer从FileChannel中读出数据然后写入到ByteBuffer中关闭RandomAccessFile和FileChannel

执行完以上几步之后,输出的内容就是"helloworld"

注意:read()方法根据缓冲区数组中的顺序将channel数据写入。一个缓冲区写满后,再往下一个缓冲区写。

适用于写入或者读出的数据是固定大小的几部分。

本文demo:https://github.com/77Y/NIOSample

好了,关于scatter是什么意思和NIO之Scatter的问题到这里结束啦,希望可以解决您的问题哈!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023