FileChannel 传输(zero-copy 的基础)

时间:2022-12-31 11:03:33


七、Channel-to-Channel传输

    FileChannel类有这两个独有的方法方法:transferFrom()和testTransferTo(),因此Channel-to-Channel传输中通道之一必须是FileChannel。

    直接的通道传输不会更新与某个FileChannel关联的position值。

    对于传输数据来源是一个文件的transferTo()方法,如果position + count的值大于文件的size值,传输会在文件尾的位置终止。

[java] view plain copy
  1. /** 
  2.  * 测试TransferFrom() 
  3.  */  
  4. @org.junit.Test  
  5. public void testTransferFrom() throws Exception{  
  6.     /** 
  7.      * 来源相关 
  8.      */  
  9.     RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt""rw");  
  10.     FileChannel fromChannel = fromFile.getChannel();  
  11.   
  12.     /** 
  13.      * 目标相关 
  14.      */  
  15.     RandomAccessFile toFile = new RandomAccessFile("toFile.txt""rw");  
  16.     FileChannel toChannel = toFile.getChannel();  
  17.   
  18.     /** 
  19.      * 传输量 
  20.      */  
  21.     long position = 0;  
  22.     long count = fromChannel.size();  
  23.   
  24.     /** 
  25.      * 执行传输(FileChannel to FileChannel) 
  26.      */  
  27.     toChannel.transferFrom(fromChannel, position, count);  
  28.       
  29.     toChannel.close();  
  30.     toFile.close();  
  31.     fromChannel.close();  
  32.     fromFile.close();  
  33. }  
[java] view plain copy
  1. /** 
  2.  * 测试TransferTo() 
  3.  */  
  4. @org.junit.Test  
  5. public void testTransferTo() throws Exception{  
  6.     /** 
  7.      * 来源相关 
  8.      */  
  9.     RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt""rw");  
  10.     FileChannel fromChannel = fromFile.getChannel();  
  11.       
  12.     /** 
  13.      * 目标相关 
  14.      */  
  15.     WritableByteChannel toChannel = Channels.newChannel(System.out);  
  16.       
  17.     /** 
  18.      * 执行传输(文件通道 to 普通通道) 
  19.      */  
  20.     fromChannel.transferTo(0, fromChannel.size(), toChannel);  
  21.     fromChannel.close();  
  22.     fromFile.close();  
  23. }