JAVA NIO Scatter/Gather(矢量IO),nioscatter
矢量IO=Scatter/Gather:
在多個緩沖區上實現一個簡單的IO操作。減少或避免了緩沖區拷貝和系統調用(IO)
write:Gather
數據從幾個緩沖區順序抽取並沿著通道發送,就好比全部緩沖區全部連接起來放入一個大的緩沖區進行發送,緩沖區本身不具備gather能力。
read:Scatter
從通道讀取的數據會按順序散布到多個緩沖區,直到緩沖區被填滿或者通道數據讀完。
![]()
Gather:
![]()
Scatter:
![]()
示例代碼:
1 /**
2 * channel Gather/Scatter
3 */
4 public static void channelGatherScatter(){
5 ByteBuffer head = ByteBuffer.allocate(4);
6 ByteBuffer body = ByteBuffer.allocate(100);
7 RandomAccessFile afile = null;
8 RandomAccessFile bfile = null;
9 ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
10 try {
11 afile = new RandomAccessFile("hello.txt", "r");
12 bfile = new RandomAccessFile("hehe.txt", "rw");
13 readWriteLock.readLock().lock();
14 FileChannel fileChannel = afile.getChannel();
15 ByteBuffer[] buffers = {head, body};
16 while (fileChannel.read(buffers) != -1){
17 }
18 head.flip();
19 body.flip();
20 System.out.println(new String(head.array()));
21 System.out.println(new String(body.array()));
22 readWriteLock.readLock().unlock();
23 fileChannel.close();
24 afile.close();
25
26 readWriteLock.writeLock().lock();
27 FileChannel bfileChannel = bfile.getChannel();
28
29 while (bfileChannel.write(buffers) > 0){
30 }
31
32 readWriteLock.writeLock().unlock();
33 bfileChannel.close();
34 bfile.close();
35 }catch (Exception e){
36 e.printStackTrace();
37 }
38 }
帶offset、length參數重載read write方法,指明從那個buffer開始,共使用多少個buffer。