Cómo enviar datos de un canal a otro
En NIO de Java, si uno de los dos canales es un FileChannel, entonces podemos transferir datos directamente de un canal al otro. Hay dos métodos para transferir datos entre dos canales:
- transferFrom()
- transferTo()
5.1 transferFrom()
El método transferFrom() de FileChannel transfiere datos desde un canal de origen a un FileChannel (que se explica en la documentación del JDK como transferir bytes de un canal de bytes legible determinado a un archivo en ese canal). Aquí hay un ejemplo simple:
RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();//obtener el canal de origen;
RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel toChannel = toFile .getChannel();//obtener el canal de destino;
posición larga = 0;
cuenta larga = fromChannel.size();
resultado largo = toChannel.transferFrom( fromChannel, posición, cuenta)
LogUtil.log_debug(""+resultado
1
2
3
4;
5
6
7
8
9
10< / p>
11
12
1
2
3
4
5
6
7
8
9
10
11
12
Los parámetros de entrada del método
-position indica que los datos que se escribirán en el archivo de destino comenzando desde la posición,
: el recuento representa el número máximo de bytes a transferir. Si el espacio restante en el canal de origen es menor que el conteo de bytes, la cantidad de bytes transferidos es menor que la cantidad de bytes solicitados.
Tenga en cuenta también que en la implementación de SoketChannel, SocketChannel solo transmite datos que están listos en este momento (que pueden tener menos que contar bytes). Por lo tanto, es posible que SocketChannel no transfiera todos los datos solicitados (contar bytes) a FileChannel.
5.2 Método transferTo()
El método transferTo() transfiere datos de un FileChannel a otro canal.
Aquí hay un ejemplo simple:
RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();//obtener el canal de origen;
RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel toChannel = toFile .getChannel();//obtener el canal de destino;
posición larga = 0;
recuento largo = fromChannel.size();
resultado largo = fromChannel.transferTo( posición, recuento, toChannel )
LogUtil.log_debug(""+resultado
1
2
3
4;
5
6
7
8
9
10< / p>
1
2
3
4
5
6
7
8
9
10
La observación muestra que estos dos ejemplos son en realidad muy similares, aunque sólo sea desde un punto de vista Perspectiva IO del archivo. Desde la perspectiva del archivo IO, esta es una copia de datos entre dos archivos;
El problema de SocketChannel mencionado anteriormente también existe en el método transferTo().