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-23 17:14:47

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

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

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

java的nio之:java的nio系列教程之selector

一:Java NIO的selector的概述===>Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 二:Java NIO的为什么要使用selector===>仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道.事实上,可以只用一个线程处理所有的通道.对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些

Python开发WebService系列教程之REST,web.py,eurasia,Django_python

在Bioinformatics(生物信息学)领域,WebService是很重要的一种数据交换技术,未来必将更加重要.目前EBI所提供的WebService就分别有SOAP和REST两种方式的服务,不管是数据服务还是计算服务(计算任务提交). 1 Python + SOAP/WSDL/UDDI 最普遍的做法(个人观点)是使用 python ZSI2.0   ,ZSI还依赖于 SOAPpy  和 pyXML  等LIB. SOAP协议很多人都很熟悉,有很多现有的应用也都使用Java等语言来开发服务端

java的nio之:java的nio系列教程之FileChannel

一:Java NIO的FileChannel===>Java NIO中的FileChannel是一个连接到文件的通道.可以通过文件通道读写文件. ===>FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下. 二:Java NIO的FileChannel的打开 ===>在使用FileChannel之前,必须先打开它.但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream. OutputStream或RandomAccessFile来获取一个

java的nio之:java的nio系列教程之java的io和nio的区别

当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代码设计. Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. IO                NIO 面向流            面向缓冲 阻塞IO           非阻塞IO 无 选择器   面向流与面向缓冲 Java N

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

一:java的nio的buffer==>Java NIO中的Buffer用于和NIO通道Channel进行交互.==>数据是从通道channel读入缓冲区buffer,从缓冲区buffer写入到通道中channel的.==>缓冲区buffer本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. 二:buffer的基本用法 ==>使用Buffer读写数据一般遵循以下四个步骤: 写入数据到Buffer

java的nio之:java的nio系列教程之serverSocketChannel

Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样.ServerSocketChannel类在 java.nio.channels包中. 这里有个例子: 01 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); 02   03 serverSocketChannel.socket().bind(new InetS

java的nio之:java的nio系列教程之Scatter/Gather

一:Java NIO的scatter/gather应用概念 ===>Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作.===>分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中.因此,Channel将从Channel中读取的数据"分散(scatter)"到多个Buffer中.===>聚集(

java的nio之:java的nio系列教程之SocketChannel

Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel.   打开 SocketChannel 下面是SocketChannel的打开方式: 1 SocketChannel socketChannel = SocketChannel.open(); 2 soc