1. 程式人生 > 實用技巧 >Java NIO之Scatter(分散)/Gather(聚集)簡介

Java NIO之Scatter(分散)/Gather(聚集)簡介

分散讀取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();
}