多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
从一个文件中读出数据并将数据传到另一台服务器上,如果使用JAVA FileChannel的transferTo() 方法可以实现这个过程,该方法将数据从文件通道传输到给定的可写字节通道 ![](https://img.kancloud.cn/f9/82/f982024d771e32babe4b0aa5018f114f_990x648.png) 这种实现,可以有以下几点改进: * 上下文切换的次数从四次减少到了两次 * 拷贝次数从四次减少到了三次(其中DMA copy 2次,CPU copy 1次) ``` `File.read(file, buf, len);` `Socket.send(socket, buf, len);` ``` 可替代为: ``` public void transferTo(long position, long count, WritableByteChannel target); ``` 在 UNIX 和各种 Linux 系统中,此调用被传递到 `sendfile()` 系统调用中,最终实现将数据从一个文件描述符传输到了另一个文件描述符 在 Linux 内核 2.4 及后期版本中,针对套接字缓冲区描述符做了相应调整,DMA自带了收集功能,对于用户方面,用法还是一样,只是内部操作已经发生了改变: ![](https://img.kancloud.cn/3e/b0/3eb0ee93e994de07cbc8d044d85af185_906x638.png) 具体过程: 1、transferTo() 方法使用 DMA 将文件内容拷贝到内核读取缓冲区。 2、避免了内容的整体拷贝,只把包含数据位置和长度信息的描述符追加到套接字缓冲区,DMA 引擎直接把数据从内核缓冲区传到协议引擎,从而消除了最后一次 CPU参与的拷贝动作