Java NIO 通道之間的數(shù)據(jù)傳輸

Java NIO 通道之間的數(shù)據(jù)傳輸

在Java NIO中,如果兩個通道中有一個是FileChannel,那你可以直接將數(shù)據(jù)從一個channel 傳輸?shù)搅硗庖粋€channel。

transferFrom()

FileChannel的transferFrom()方法可以將數(shù)據(jù)從源通道傳輸?shù)紽ileChannel中

下面的代碼實現(xiàn)文件的復(fù)制


package com.viashare.channel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * Created by Jeffy on 16/5/17.
 */
public class ChannelMain {

    private static final String PATH_FROM = "/Users/jeffy-pc/Downloads/test.txt";
    private static final String PATH_TO = "/Users/jeffy-pc/Downloads/test3.txt";

    public static void main(String[] args) throws IOException {
        copy();
    }

    private static final void copy() throws IOException {

        FileInputStream randomAccessFileFrom = new FileInputStream(new File(PATH_FROM));
        FileOutputStream randomAccessFileTo = new FileOutputStream(new File(PATH_TO));
        FileChannel fromchannel = randomAccessFileFrom.getChannel();
        FileChannel tochannel = randomAccessFileTo.getChannel();
        long position = 0;
        long count = fromchannel.size();
        tochannel.transferFrom(fromchannel,position, count);
    }

}


方法的輸入?yún)?shù)position表示從position處開始向目標(biāo)文件寫入數(shù)據(jù),count表示最多傳輸?shù)淖止?jié)數(shù)。如果源通道的剩余空間小于 count 個字節(jié),則所傳輸?shù)淖止?jié)數(shù)要小于請求的字節(jié)數(shù)。
此外要注意,在SoketChannel的實現(xiàn)中,SocketChannel只會傳輸此刻準(zhǔn)備好的數(shù)據(jù)(可能不足count字節(jié))。因此,SocketChannel可能不會將請求的所有數(shù)據(jù)(count個字節(jié))全部傳輸?shù)紽ileChannel中。

transferTo()

是不是發(fā)現(xiàn)這個例子和前面那個例子特別相似?除了調(diào)用方法的FileChannel對象不一樣外,其他的都一樣。
上面所說的關(guān)于SocketChannel的問題在transferTo()方法中同樣存在。SocketChannel會一直傳輸數(shù)據(jù)直到目標(biāo)buffer被填滿。

 private static final void transferToCopy() throws IOException {
        FileInputStream randomAccessFileFrom = new FileInputStream(new File(PATH_FROM));
        FileOutputStream randomAccessFileTo = new FileOutputStream(new File(PATH_TO));
        FileChannel fromchannel = randomAccessFileFrom.getChannel();
        FileChannel tochannel = randomAccessFileTo.getChannel();
        long position = 0;
        long count = fromchannel.size();
        fromchannel.transferTo(position, count,tochannel);
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容