NIO之通道之間的資料傳輸
阿新 • • 發佈:2018-12-11
在Java NIO中,如果兩個通道中有一個是FileChannel,那你可以直接將資料從一個channel(譯者注:channel中文常譯作通道)傳輸到另外一個channel。
transferFrom()
- FileChannel的transferFrom()方法可以將資料從源通道傳輸到FileChannel中(這個方法在JDK文件中的解釋為將位元組從給定的可讀取位元組通道傳輸到此通道的檔案中)。
- 例項
RandomAccessFile fromFile = new RandomAccessFile("D:/data.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();
RandomAccessFile toFile = new RandomAccessFile("D:/toData.txt", "rw");
FileChannel toChannel = toFile.getChannel();
// position表示從position處開始向目標檔案寫入資料
long position = 0;
// count表示最多請求的位元組數。如果源通道的剩餘空間小於請求的位元組數,則實際傳輸的位元組數要小於請求的位元組數
// 此外要注意,在SoketChannel的實現中,SocketChannel只會傳輸此刻準備好的資料(可能不足count位元組)。
// 因此,SocketChannel可能不會將請求的所有資料(count個位元組)全部傳輸到FileChannel中。
long count = fromChannel.size();
toChannel.transferFrom(fromChannel, position, count);
transferTo()
transferTo()
和transferFrom()
正好相反,將資料從FileChannel中傳輸到其他的Channel中- 例項
RandomAccessFile fromFile = new RandomAccessFile("D:/data.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();
RandomAccessFile toFile = new RandomAccessFile("D:/toData.txt", "rw");
FileChannel toChannel = toFile.getChannel();
// position表示從position處開始向目標檔案寫入資料
long position = 0;
// count表示最多請求的位元組數。如果源通道的剩餘空間小於請求的位元組數,則實際傳輸的位元組數要小於請求的位元組數
// 上面所說的關於SocketChannel的問題在transferTo()方法中同樣存在。SocketChannel會一直傳輸資料直到目標buffer被填滿
long count = fromChannel.size();
fromChannel.transferFrom(toChannel, position, count);
參考: 併發程式設計網.