`

05. Java NIO 通道之间的数据传输

 
阅读更多

 

在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel。

transferFrom()
FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中)。

下面是一个简单的例子:

 

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

 
方法的输入参数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被填满。

 

分享到:
评论

相关推荐

    java NIO.zip

    自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发连接时。NIO的核心在于通道(Channels)和缓冲区(Buffers)的概念,与传统的流(Streams)有所不同。 1. **通道...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    在Java NIO中,数据是以通道(Channels)和缓冲区(Buffers)的形式进行传输,而不是直接通过流。这种设计使得NIO能够同时处理多个输入/输出操作,从而实现多路复用。 标题“nio.rar_NIO_NIO-socket_java nio_java ...

    JavaNIO chm帮助文档

    Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO...

    Java.nio 与Java.io比较

    1. **数据传输方式**:Java.io基于流模型,而Java.nio基于通道和缓冲区模型。 2. **性能**:Java.nio在处理大量数据和高并发场景下表现更优,尤其是在网络编程和大文件处理上。 3. **阻塞性**:Java.io是阻塞式的,...

    java网络编程NIO视频教程

    - **学习目标**:掌握高效的数据传输技巧。 #### 12. Java NIO-Buffer-概述 - **主要内容**:介绍Buffer(缓冲区)的概念及其在NIO中的作用。 - **学习目标**:理解Buffer的基本结构和使用场景。 #### 13. Java ...

    The_Study_about_Java.nio.rar_java nio

    2. **缓冲区(Buffers)**:缓冲区是Java NIO的核心,它是内存块的抽象,用于在通道和应用程序之间传输数据。各种类型的原始数据类型(如byte、char、int等)都有对应的Buffer类。 3. **选择器(Selectors)**:...

    Java NIO英文高清原版

    7. **管道(Pipe)**:管道是两个线程间进行单向数据传输的通道。一个线程写入数据,另一个线程读取数据。 Netty利用NIO的特性,提供了高度优化的API,使得开发者可以轻松地构建高效、可靠的网络服务。Netty的事件...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    java nio 包读取超大数据文件

    - **Buffers**:用来存储数据的对象,是数据传输的载体。 - **Selectors**:多路复用器,用于监控多个Channel的状态变化,支持高效地处理大量并发连接。 - **FileChannel**:用于与文件进行交互的Channel,提供了...

    nio.zip_NIO_NewIO_NIO.c_java NIO chm_java nio

    NIO提供了更高效、更灵活的数据传输方式,尤其适用于高并发和大数据量的场景。 在Java的NIO体系中,核心概念包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。通道是数据读写的基础,它连接到数据源...

    Java.nio

    缓冲区则用于临时存储数据,提供了一种更有效的方式进行数据传输。NIO的核心组件还包括选择器(Selector),它允许单个线程监控多个通道的状态,从而实现多路复用,显著提高了处理大量并发连接的能力。 在Java.nio...

    Java NIO Socket基本

    1. **通道(Channel)**:类似于流,但支持双向数据传输。常见的通道类有FileChannel、SocketChannel和ServerSocketChannel等。它们都是`java.nio.channels.Channel`接口的实现类。 2. **缓冲区(Buffer)**:NIO的...

    java-nio.rar_NIO_java nio

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java IO基于流(Stream)和缓冲区(Buffer)进行...

    尚硅谷Java视频_NIO 视频教程

    尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集写入 ·07. 尚硅谷_NIO_字符集 Charset ·08. 尚硅谷_NIO_阻塞与非阻塞 ·09. 尚硅谷_NIO_阻塞式 ·10. 尚硅谷_NIO_非阻塞式 ·11. ...

    JavaNIO.zip_java nio_nio java

    1. **通道(Channels)**:通道是数据传输的途径,类似于传统IO中的流。它们可以从一个数据源读取数据,也可以向一个目的地写入数据。例如,FileChannel用于文件操作,SocketChannel用于网络通信。 2. **缓冲区...

    java nio入门学习,两个pdf

    3. **网络编程**:在网络通信中,NIO可以实现高效的客户端与服务器之间的数据传输,如HTTP、FTP服务器。 4. **多线程协作**:NIO的非阻塞特性使得多线程协作更加容易,减少线程间的上下文切换,提高整体性能。 ...

Global site tag (gtag.js) - Google Analytics