Java NIO之Scatter(分散)/Gather(聚集)簡介
阿新 • • 發佈:2021-01-19
分散讀取Scattering Reads是指資料從一個channel讀取到多個buffer中,聚集寫入Gathering Writes是指資料從多個buffer寫入到同一個channel。表現為Channel中如下兩個方法:
public final long read(ByteBuffer[] dsts) throws IOException{ ... }
public final long write(ByteBuffer[] srcs) throws IOException{ ... }
scatter / gather經常用於需要將傳輸的資料分開處理的場合,如網路傳輸中有時為了方便的處理訊息頭和訊息體,可以將訊息體和訊息頭分散到不同的buffer中。
read()方法按照buffer在陣列中的順序將從channel中讀取的資料寫入到buffer,當一個buffer被寫滿後,channel緊接著向另一個buffer中寫,Scattering Reads在移動下一個buffer前,必須填滿當前的buffer。
write()方法會按照buffer在陣列中的順序,將資料寫入到channel,注意只有position和limit之間的資料才會被寫入。因此,如果一個buffer的容量為128byte,但是僅僅包含58byte的資料,那麼這58byte的資料將被寫入到channel中。
使用示例
try { //獲取原始檔與目標檔案 RandomAccessFile srcFile = new RandomAccessFile("demo.txt", "rw"); RandomAccessFile dstFile = new RandomAccessFile("demo1.txt", "rw"); //獲取讀寫通道 FileChannel readChannel = srcFile.getChannel(); FileChannel writeChannel = dstFile.getChannel(); //構建ByteBuffer陣列 ByteBuffer buffer0 = ByteBuffer.allocate(100); ByteBuffer buffer1 = ByteBuffer.allocate(1024); ByteBuffer[] buffers = {buffer0,buffer1}; //讀取 readChannel.read(buffers); //翻轉buffer for (ByteBuffer buffer : buffers) { buffer.flip(); } //寫入 writeChannel.write(buffers); } catch (IOException e) { e.printStackTrace(); }