通道之間的資料傳輸 – Java NIO
與通常在輸入源和輸出目标之間發生 IO 的普通 Java 應用程式一樣,在 NIO 中,您也可能需要非常頻繁地将資料從一個通道傳輸到另一通道。 檔案資料從一個地方到另一個地方的批量傳輸非常普遍,以至于
FileChannel
類添加了兩種優化方法,以使其效率更高。
FileChannel.transferTo()
和 FileChannel.transferFrom()
方法
FileChannel.transferTo()
FileChannel.transferFrom()
transferTo()
和
transferFrom()
方法使您可以将一個通道交叉連接配接到另一個通道,而無需通過中間緩沖區傳遞資料。 這些方法僅在
FileChannel
類上存在,是以,在通道間傳輸中涉及的通道之一必須是
FileChannel
。
public abstract class FileChannel
extends AbstractChannel
implements ByteChannel, GatheringByteChannel, ScatteringByteChannel {
// There are more other methods
public abstract long transferTo (long position, long count, WritableByteChannel target);
public abstract long transferFrom (ReadableByteChannel src, long position, long count);
}
您無法在套接字通道之間進行直接傳輸,但是套接字通道實作了
WritableByteChannel
和
ReadableByteChannel
,是以可以使用
transferTo()
将檔案的内容傳輸到套接字,或者可以使用
transferFrom()
從套接字直接讀取資料到檔案中。
另外,請記住,如果在傳輸過程中遇到問題,這些方法可能會抛出
java.io.IOException
。
通道間資料傳輸示例
package com.howtodoinjava.nio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
public class ChannelTransferExample
{
public static void main(String[] argv) throws Exception
{
//Input files
String[] inputFiles = new String[]{"inputFile1.txt","inputFile2.txt","inputFile3.txt"};
//Files contents will be written in these files
String outputFile = "outputFile.txt";
//Get channel for output file
FileOutputStream fos = new FileOutputStream(new File(outputFile));
WritableByteChannel targetChannel = fos.getChannel();
for (int i = 0; i < inputFiles.length; i++)
{
//Get channel for input files
FileInputStream fis = new FileInputStream(inputFiles[i]);
FileChannel inputChannel = fis.getChannel();
//Transfer data from input channel to output channel
inputChannel.transferTo(0, inputChannel.size(), targetChannel);
//close the input channel
inputChannel.close();
fis.close();
}
//finally close the target channel
targetChannel.close();
fos.close();
}
}