分散(Scatter)/聚集(Gather)
(本部分原文地址,作者:Jakob Jenkov 译者:郭蕾)
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。
分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。
聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。
scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。
Scattering Reads
Scattering Reads是指数据从一个channel读取到多个buffer中。如下图描述:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
注意buffer首先被插入到数组,然后再将数组作为channel.read() 的输入参数。read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写。
Scattering Reads在移动下一个buffer前,必须填满当前的buffer,这也意味着它不适用于动态消息(译者注:消息大小不固定)。换句话说,如果存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Reads才能正常工作。
Gathering Writes
Gathering Writes是指数据从多个buffer写入到同一个channel。如下图描述:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
buffers数组是write()方法的入参,write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel中。因此与Scattering Reads相反,Gathering Writes能较好的处理动态消息。
通道之间的数据传输
本部分原文地址,作者:Jakob Jenkov,译者:郭蕾,校对:周泰)
在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注: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通信的例子,nio是io编程的新版本,比io较流行。同时本例子是适用socket通信的。可以在此基础上,添加您的个人应用。本例子适用于:java通信的学习者,android平台通信的学习者。
Java NIO(New IO,也称为Non-blocking IO)和传统的Java IO是Java编程语言中用于处理I/O操作的两种主要技术。随着互联网用户数量的激增,企业对应用程序的并发处理能力提出了更高的要求。为了解决传统Java IO模型在...
Java NIO(New IO)是Java 1.4版本引入的一个新特性,是对传统IO模型的补充和扩展,提供了一种更高效的数据处理方式。在本教程中,我们将深入探讨Java NIO流的两个关键部分:文件通道操作和选择器。 ### 文件通道...
8. **IO与NIO**:Java的IO流系统和新的NIO(New IO)框架也是实验内容,包括缓冲区、选择器和通道的使用。 9. **设计模式**:实验可能要求应用常见的设计模式,如单例、工厂、观察者等,以解决实际问题。 10. **...
在本Java高级开发的课后实验报告中,我们将深入探讨Java编程语言的高级特性与实践应用,旨在提升开发者对Java的全面理解与熟练运用。Java作为一种广泛应用的编程语言,其强大的功能和跨平台特性使其在软件开发领域...
7. **IO流与NIO**: 对于更高级的输入/输出操作,实验可能还会涉及Java的New IO(NIO)框架,包括Channel、Buffer和Selector的使用。 8. **多线程**: Java内置了对多线程的支持,实验会讲解如何创建和管理线程,以及...
【文件名称列表】:虽然具体的文件名称没有给出,但我们可以合理推测,每个实验可能对应一个或多个文件,比如实验一的源代码、实验二的解决方案、实验三的设计文档以及实验四的测试报告等。这些文件通常会按照实验的...
这个"JAVA综合实验2聊天室"项目旨在让学生理解网络编程的基本原理,特别是如何利用Java实现客户端和服务器之间的通信,以及如何设计多用户交互的系统。下面,我们将详细分析这个项目的各个方面。 首先,Java是一种...
2. 常用组件:Java GUI库包含许多预定义的组件,如按钮(Button)、文本框(TextField)、标签(Label)和滚动条(ScrollPane)等,它们用于构建交互式的用户界面。了解如何在布局管理器(如FlowLayout、GridLayout...
7. **IO/NIO**:Java NIO(New IO)提供了一种非阻塞的I/O模型,可以提高程序的性能,特别是处理大量并发连接时。 8. **Swing或JavaFX**:这两个是Java的图形用户界面(GUI)库,用于创建桌面应用程序。掌握组件的...
在本Java实验册题目答案中,我们主要探讨的是与Java编程相关的实践问题,这些题目源自华南农业大学(Scau)的课程。这个压缩包包含了所有实验的源代码,且每一份代码都已经通过了验证,确保了正确性。下面,我们将...
Java程序设计实验是计算机科学教育中的一个重要组成部分,它旨在帮助学生深入理解Java编程语言的核心概念、语法和编程实践。在这样的实验中,学生通常会经历从编写简单的控制台应用程序到实现复杂的面向对象系统的...
Java实验题目通常涵盖了许多核心Java概念,旨在帮助学习者深入理解和掌握编程技能。在这个实验科目中,你可能会遇到各种挑战,这些挑战将涉及到以下几个关键知识点: 1. **基础语法**:Java的基础语法包括变量声明...
三、Java NIO 服务器端开发的优点 Java NIO 服务器端开发提供了非阻塞式的 I/O 操作,能够提高服务器端的性能和可扩展性。NIO 模式可以使服务器端处理大量的客户端连接,提高服务器端的并发能力。此外,NIO 模式还...
《Java 2实用教程(3版)实验代码及答案》是针对Java初学者和进阶者的一份宝贵资源,它涵盖了Java编程的基础到高级概念,包括详细的实验代码和对应的解答,帮助读者深入理解和掌握Java语言。这个压缩包中的文档很...
4. **NIO(非阻塞I/O)**:Java的NIO库提供了选择器和通道的概念,使得程序可以同时处理多个连接,提高并发性能。Selector用于监听多个Channel,而Channel则连接到网络套接字或其他I/O源。 5. **HTTPClient**:Java...
2. **面向对象编程**: Java是一种面向对象的语言,实验中可能会涉及到类、对象、封装、继承、多态等概念。教师可以设计创建类、对象交互、类继承和接口实现的题目。 3. **异常处理**: 学习如何使用try-catch-...
Java教程及实验指导是针对Java编程语言的学习资源集合,涵盖了从基础到实践的全面内容。这份资料主要包含以下几个方面: 1. **Java基础知识**:Java教程通常会从基础语法开始,如变量、数据类型、运算符、流程控制...
实验深入讲解Java的输入输出流体系,包括字节流、字符流、缓冲流等,以及最新的NIO(非阻塞I/O)框架,让学生掌握高效的数据传输方法。 实验七:多线程编程 Java支持并发编程,学生将学习如何创建和管理线程,理解...
这份报告总计三十多页,内容丰富,包括了详细的实验步骤、代码实现以及实验过程中的截图,是学习和复习Java知识的宝贵资料。 一、Java基础实验 在Java实验的初期阶段,我们通常会从基础语法入手,例如变量声明、...