在Java NIO中,如果兩個通道中有一個是FileChannel,那你可以直接將資料從一個channel(譯者註:channel中文常譯作通道)傳送到另外一個channel。
transferFrom():被動接收
FileChannel的transferFrom()方法可以將資料從來源通道傳輸到FileChannel(譯者註:這個方法在JDK文檔中的解釋為將位元組從給定的可讀取位元組通道傳輸到此通道的檔案中)。
方法的輸入參數position表示從position處開始向目標檔案寫入數據,count表示最多傳輸的位元組數。如果來源通道的剩餘空間小於 count 個位元組,則所傳送的位元組數要小於請求的位元組數。
此外要注意,在SoketChannel的實作中,SocketChannel只會傳輸此刻準備好的資料(可能不足count位元組)。因此,SocketChannel可能不會將請求的所有資料(count個位元組)全部傳輸到FileChannel。
transferTo():主動傳送
transferTo()方法將資料從FileChannel傳送到其他的channel。下面是一個簡單的例子:
除了呼叫方法的FileChannel物件不一樣外,其他的都一樣。
上面所說的關於SocketChannel的問題在transferTo()方法中同樣存在。 SocketChannel會一直傳輸資料直到目標buffer被填滿。
範例:
@Testpublic void test2() { 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();//从from 读到 本通道;注意socketfrom只会发送已经准备好的,不会发送count个 toChannel.transferFrom(fromChannel,position, count);//将本通道 写到 to;注意sockedfrom会一直发送,直到to被填满 fromChannel.transferTo(position, count, toChannel); }
以上是JAVA之Channel之間的資料傳輸方法講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!