zoukankan      html  css  js  c++  java
  • Java NIO系列教程(五) 通道之间的数据传输

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。

    transferFrom()

    FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中)。下面是一个简单的例子:

    package java_.nio_.demo;
    
    import java.io.RandomAccessFile;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    
    public class TransferFromMethodMain {
    
        public static void main(String[] args) throws Exception {
            RandomAccessFile rafFrom = new RandomAccessFile("E:/edu/FileChannelMain.txt", "rw");
            RandomAccessFile rafTo = new RandomAccessFile("E:/edu/FileChannelMain.txt", "rw");
            FileChannel fcFrom = rafFrom.getChannel();
            FileChannel fcTo = rafTo.getChannel();
            long position = 0;
            long count = fcFrom.size();
            fcTo.transferFrom(fcFrom, position, count);
            ByteBuffer buf = ByteBuffer.allocate(1024);
            int reads = fcTo.read(buf);
            if(reads != -1){
                buf.flip();
                while(buf.hasRemaining()){
                    System.out.print((char)buf.get());
                }
                buf.clear();
            }
        }
    }

    方法的输入参数position表示从position处开始向目标文件写入数据,count表示最多传输的字节数。如果源通道的剩余空间小于 count 个字节,则所传输的字节数要小于请求的字节数。
    此外要注意,在SoketChannel的实现中,SocketChannel只会传输此刻准备好的数据(可能不足count字节)。因此,SocketChannel可能不会将请求的所有数据(count个字节)全部传输到FileChannel中。

    transferTo()

    transferTo()方法将数据从FileChannel传输到其他的channel中。下面是一个简单的例子:

    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();
    fromChannel.transferTo(position, count, toChannel);

    是不是发现这个例子和前面那个例子特别相似?除了调用方法的FileChannel对象不一样外,其他的都一样。
    上面所说的关于SocketChannel的问题在transferTo()方法中同样存在。SocketChannel会一直传输数据直到目标buffer被填满。

  • 相关阅读:
    grunt in webstorm
    10+ Best Responsive HTML5 AngularJS Templates
    响应式布局
    responsive grid
    responsive layout
    js event bubble and capturing
    Understanding Service Types
    To add private variable to this Javascript literal object
    Centering HTML elements larger than their parents
    java5 新特性
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6340109.html
Copyright © 2011-2022 走看看