天天看點

通道之間的資料傳輸 – Java NIO

通道之間的資料傳輸 – Java NIO

與通常在輸入源和輸出目标之間發生 IO 的普通 Java 應用程式一樣,在 NIO 中,您也可能需要非常頻繁地将資料從一個通道傳輸到另一通道。 檔案資料從一個地方到另一個地方的批量傳輸非常普遍,以至于 ​

​FileChannel​

​ 類添加了兩種優化方法,以使其效率更高。

​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();
  }
}