參考:http://ifeve.com/java-nio-channel-to-channel/
原文地址
目錄
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之間的數據傳輸
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服務器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
在Java NIO中,如果兩個通道中有一個是FileChannel
,那你可以直接將數據從一個channel
(譯者注:channel中文常譯作通道)傳輸到另外一個channel
。
transferFrom()
FileChannel
的transferFrom()
方法可以將數據從源通道傳輸到FileChannel
中(譯者注:這個方法在JDK文檔中的解釋為將字節從給定的可讀取字節通道傳輸到此通道的文件中)。下面是一個簡單的例子:
RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();
RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel toChannel = toFile.getChannel();
long position = 0;
long count = fromChannel.size();
toChannel.transferFrom(position, count, fromChannel);
方法的輸入參數position
表示從position
處開始向目標文件寫入數據,count
表示最多傳輸的字節數。如果源通道的剩余空間小于 count
個字節,則所傳輸的字節數要小于請求的字節數。
此外要注意,在SoketChannel
的實現中,SocketChannel
只會傳輸此刻準備好的數據(可能不足count
字節)。因此,SocketChannel
可能不會將請求的所有數據(count
個字節)全部傳輸到FileChannel
中。
transferTo()
transferTo()
方法將數據從FileChannel
傳輸到其他的channel
中。下面是一個簡單的例子:
RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();
RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel toChannel = toFile.getChannel();
long position = 0;
long count = fromChannel.size();
fromChannel.transferTo(position, count, toChannel);
是不是發現這個例子和前面那個例子特別相似?除了調用方法的FileChannel
對象不一樣外,其他的都一樣。
上面所說的關于SocketChannel
的問題在transferTo()
方法中同樣存在。SocketChannel
會一直傳輸數據直到目標buffer
被填滿。