java的nio之:java的nio系列教程之channel的数据交换

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

transferFrom()

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

01    RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
02    FileChannel      fromChannel = fromFile.getChannel();
03    
04    RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
05    FileChannel      toChannel = toFile.getChannel();
06    
07    long position = 0;
08    long count = fromChannel.size();
09    
10    toChannel.transferFrom(position, count, fromChannel);
方法的输入参数position表示从position处开始向目标文件写入数据,count表示最多传输的字节数。如果源通道的剩余空间小于 count 个字节,则所传输的字节数要小于请求的字节数。
此外要注意,在SoketChannel的实现中,SocketChannel只会传输此刻准备好的数据(可能不足count字节)。因此,SocketChannel可能不会将请求的所有数据(count个字节)全部传输到FileChannel中。

transferTo()

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

01    RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
02    FileChannel      fromChannel = fromFile.getChannel();
03    
04    RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
05    FileChannel      toChannel = toFile.getChannel();
06    
07    long position = 0;
08    long count = fromChannel.size();
09    
10    fromChannel.transferTo(position, count, toChannel);
是不是发现这个例子和前面那个例子特别相似?除了调用方法的FileChannel对象不一样外,其他的都一样。
上面所说的关于SocketChannel的问题在transferTo()方法中同样存在。SocketChannel会一直传输数据直到目标buffer被填满。

时间: 2024-12-08 17:18:55

java的nio之:java的nio系列教程之channel的数据交换的相关文章

java的nio之:java的nio系列教程之channel的概念

一:java的nio的channel Java NIO的通道类似流,但又有些不同: ==>既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. ==>通道可以异步地读写. ==>通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入. 正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道.如下图所示: 二:java的nio的channel的实现 这些是Java NIO中最重要的通道的实现: ==>FileChannel  : ==>

kali linux 系列教程之metasploit 连接postgresql可能遇见的问题

kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂   目录 kali linux 下metasploit 连接postgresql可能遇见的问题................................ 1 前言............................................................................................................... 1

集群系列教程之:keepalived+lvs 部署

集群系列教程之:keepalived+lvs 前言:最近看群里很多人在问keepalived+lvs的架构怎么弄,出了各种各样的问题,为此特别放下了别的文档,先写一篇keepalived+lvs架构的文档,使那些有需求的人能够得以满足.但是此篇文档是架构文档,不是基础理论,但我想你能做这个架构,势必也了解了基础理论知识,更多的理论知识体系,请看下回分解.... 测试拓扑: 环境说明: 从上面的拓扑图,就可以看出本实验的环境信息,其中实线代表的是真实的物理连接,而虚线表示的是逻辑关系.hostna

WCF系列教程之WCF服务宿主

本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF也不例外.如果我们需要使用WCF服务,那么我们就必须将服务寄宿与创建它并控制它的上下文和生存期的运行时环境当中,承载服务的环境,称之为宿主.WCF服务可以在支持托管代码的任意Windows进程中运行.WCF提供了统一编程模型,用于生成面向服务的应用程序.此编程模型保持一致且独立于部署服务的运行时环境

Android系列教程之Activity的生命周期

通过上一节"Android系列教程之Android项目的目录结构"我们已经知道了什么是Activity,那么为什么我们创建一个Activity的导出类的时候为什么都要覆盖Activity的onCreate方法呢,为什么会在onPause()方法中保存一些当前Activity中的变化,要弄明白这些就要先了解Activity的生命周期,也就是一个Activity才开始到结束都要经过那些状态,下面通过一个例子了解Activity的声明周期. 一:Activity的生命周期方法 Android

iOS系列教程之TextKit实现图文混排读后记

iOS系列教程之TextKit实现图文混排读后记 前两天看搜狐家明哥写的<TextKit实现图文混排> 今晚回家看了下API发现了一个更加取巧的实现方式.可以直接将后台返回的html富文本用textView显示出来. 记得两年前当时做这个的时候还是借助了笨重的webview. > Textkit是iOS7新推出的类库,其实是在之前推出的CoreText上的封装,有了这个TextKit,以后不用再拿着CoreText来做累活了, 下面是我分别用UITextView 和UIWebView 显

kali Linux系列教程之BeFF安装与集成Metasploit

kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 1.1 apt-get安装方式 1.2 启动 1.3 基本测试 1.4 异常信息 1.5 从源码安装BeEF 1.5.1 安装curl git 1.5.2 安装rvm 1.5.3 安装依赖项 1.5.4 安装ruby 1.5.5 安装bundler 1.5.6下载beef 1.5.7 安装和启动 1.6 集成metasploit 1.1 apt-get安装方式 打开终端,输入如下命令: apt-get install

Kali Linux系列教程之OpenVas安装

Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装... 1 前言... 1 1.  服务器层组件... 1 2.客户层组件... 1 安装过程... 2 Initial setup. 2 初始管理员密码... 4 从浏览器访问后台... 4 更新数据... 7 管理用户... 8 扫描器配置信息查看... 9 修复安装错误... 9 创建证书... 10 更新NVT. 12 客户端证书错误... 13 前言 OpenVAS是一款

web系列教程之php 与mysql 动态网站 。检索 与更新。

接着上次WEb 系列开发之php 与mysql动态网站入门. 个人觉得,学习技术就像一棵大树,主干很重要,枝叶其次.对于学习技术,我们应该分清主次关系.怎么学?为什么要学?有一个较好的分寸. 有时候觉得 国内有些教育,从一开始就从枝叶 细节说的很清楚.说了一大堆,就是很散的感觉,虽然有很多知识.但是学的人呢,并不清楚这个的实际应用, 这样会导致学习兴趣的缺失.个人觉得 就比如 php 和mysql吧,虽然我也不是高手,但就学习上面还是能评论几句的,比如我从表单开始 讲表单的注册,也就是 网站会员