1、通道基础
通道(channel)用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或者套接字)之间有效的传输数据。通道将数据传输给ByteBuffer对象或者从ByteBuffer对象获取数据进行传输。
通道是一种途径,借助该途径,可以用最小的总开销来访问操作系统本身的I/O服务。缓冲区则是通过内部用来发送和接受数据的端点。
通道是访问I/O服务的导管,I/O可以分为广义的两大类别:File I/O和Stream I/O。那么相应的有两种类型的通道也就不足为奇了,他们是文件(File)通道和套接字(socket)通道。
通道会连接一个特定I/O服务且通道实例(channel instance)的性能受它所连接的I/O服务的特征限制。
通道可以以阻塞(blocking)或非阻塞(noblocking)模式运行。非阻塞模式的通道永远不会让调用的县城休眠。请求的操作要么立即完成,要么返回一个结果表明未进行任何操作。只有面向流的(stream-oriented)的通道,如sockets和pipes才能使用非阻塞模式。
2、Scatter/Gather
通道提供了一种被称为Scatter/Gather的重要新功能(有时也被称为矢量I/O)。Scatter/Gather是一个简单却强大的概念,它是指在多个缓冲区上实现一个简单的I/O操作。对于一个write操作而言,数据时从几个缓冲区按照顺序抽取(称为gather)并沿着通道发送的。缓冲区本身不需要具备这种gather的能力。该gather过程的效果就好比全部缓冲区得内容被连接起来,并在发送数据前存放到一个大的缓冲区中。对于read操作而言,从通道读取的数据会按顺序被散步(称为Scatter)到多个缓冲区,将每个缓冲区填满直至通道中的数据或者缓冲区的最大空间被消耗完。
很简单的,我们可以用一个gather操作将多个缓冲区的数据组合并发送出去。使用相同的缓冲区,我们可以像下面这样汇总数据并在一个socket通道上发送包。使用Scatter则刚好相反。
使用得当的话,Scatter/Gather会是一个及其强大的工具。它允许用户您委托操作系统来完成辛苦活:将读取到的数据分开存放到多个存储桶(bucket)或者将不同的数据区合并成一个整体。
3、文件通道
此处省略一万字。。。。。。
4、socket通道
DatagramChannel和SocketChannel实现定义读写功能的接口,而ServerSocketChannel不实现。ServerSocketChanel负责监听传入的连接和创建新的SocketChannel对象,它本身不传输数据。
1> ServerSocketChannel是一个基于通道的socket监听器。它同我们所熟悉的java.net.ServerSocket执行相同的基本任务,不过它增加了通道语义,因此能够在非阻塞模式下运行。
用静态的open()工厂方法创建一个新的ServerSocketChannel对象,将会返回同一个未绑定的java.net.ServerSocket关联的通道。该对等ServerSocket可以通过在返回的ServerSocketChannel上调用socket()方法来获取。作为serverSocketChannel的对等体被创建的ServerSocket对象依赖通道实现。这些socket关联的SocketImpl能识别通道。通道不能被封装在随意的socket对象外面。
2>Socket和SocketChannel类封装点对点、有序的网络连接,类似于我们所熟知并喜爱的TCP/IP网络连接。SocketChannel扮演客户端发起同一个监听服务器的连接。指导连接成功,它才能收到数据并且只会从连接到的地址接受。每个SocketChannel对象创建时都是同一个对等的java.net.Socket对象串联的。静态的open()方法可以创建一个新的SocketChannel对象,而在新创建的SocketChannel上调用socket()方法能返回它对等的Socket对象;在该socket上调用getChannel()方法则能返回最初的那个SocketChannel。
3>最后一个socket通道是DatagramChannel。正如SocketChannel对应socket,serverSocketChannel对应serverSocket,每一个DatagramChannel对象也有一个关联的DatagramSocket对象。
正如socketChannel模拟连接导向的流协议(如TCP/IP),DatagramChannel则模拟包导向的无连接协议(如UDP/IP)。创建DatagramChannel的模式和创建其他Socket通道是一样的。DatagramChannel对象既可以充当服务器(监听者)也可以充当客户端(发送者)。如果您希望新创建的通道负责监听,那么通道必须首先被绑定到一个端口或者地址、端口组合上。绑定DatagramChannel同时绑定一个常规的DategramSocket没什么区别。
DatagramChannel是无连接的。每个数据报(datagram)都是一个自包含的实体,拥有它自己的目的地址及不依赖其他数据报的数据净荷。与面向流的的socket不同,DatagramChannel可以发送单独的数据报给不同的目的地址。同样,DatagramChannel对象也可以接收来自任意地址的数据包。每个到达的数据报都含有关于它来自何处的信息(源地址)。
5、管道
管道(pipe)就是一个用来在两个实体之间单向传输数据的导管。在Unix系统中,管道被用来连接一个进程的输出和另一个进程的输入。管道可以被用来尽在同一个java虚拟机内部传输数据。虽然有更加有效率的方式来在线程之间传输数据,但是使用管道的好处在于封装性。
分享到:
相关推荐
### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...
**NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与...然而,NIO的学习曲线相对较陡峭,需要对操作系统级别的I/O模型有一定了解,但一旦掌握,将极大地提升系统的性能和可扩展性。
### Nio学习笔记:深入理解Java的Buffer机制 在Java的NIO(Non-blocking I/O)框架中,`Buffer`类及其子类扮演着至关重要的角色。这些类提供了处理基本类型数据的能力,使得数据能够在内存和I/O设备之间高效地传输...
ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。ByteBuffer是一个字节缓冲区,可以存储字节序列。在NIO中,所有的数据读写都通过缓冲区进行,ByteBuffer与其他类型的Buffer...
- **Channel**:作为数据源或目的地,可以从一个通道读取数据到Buffer,或从Buffer写入数据到另一个通道,如`FileChannel`、`SocketChannel`等。 - **Charset编码解码**:提供字符集的编码和解码,支持多种字符...
《NIO学习笔记》 在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,与传统的BIO(Blocking I/O)相对应。NIO提供了一种新的方式来处理I/O操作,特别是在处理大量并发连接时,它的...
Java NIO 提供了多种通道,如FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,分别用于文件、UDP和TCP网络通信。 2. **缓冲区(Buffer)**:缓冲区是NIO中的核心概念,它是数据的容器。读取数据...
NIO的核心概念包括通道(Channel)和缓冲区(Buffer),这两个组件使得数据以块的形式进行传输,从而提高了性能。 1. **通道(Channel)**: - 通道是数据传输的双向路径,可以将数据从源读取到目标,也可以将数据...
JavaSE 7引入了NIO(Non-blocking Input/Output)提供了一种更高效的IO处理模式,包括通道(Channels)和缓冲区(Buffers)的概念。 JavaSE还包含了大量的标准库,如JDBC(Java Database Connectivity)用于数据库...
本资料包含学习笔记和答案,便于自我检验和理解。 1. **Java基础知识**: - **内存管理**:包括垃圾回收机制、内存泄漏及其检测方法、JVM内存模型(堆、栈、方法区等)。 - **数据类型与数据结构**:深入理解原始...
Java学习笔记是初学者探索Java编程世界的宝贵资源。这份由老师精心整理的课程笔记涵盖了Java的基础到进阶知识,旨在帮助新手快速理解并掌握这门强大的面向对象编程语言。笔记内容可能包括但不限于以下方面: 一、...
【Java IO操作详解】 在Java编程中,IO(Input/Output)操作是处理数据输入与输出的核心技术。Java-IO操作共19页的笔记详细介绍了这一关键领域,旨在帮助...这19页的学习笔记将是你掌握Java IO操作的重要参考资料。
JAVA学习笔记是一个全面涵盖JAVA编程基础到进阶的资源集合,特别适合初学者掌握JAVA语言和项目开发技术。笔记内容包括了几个核心领域,如编程思想、多线程设计模式、网络编程,以及JAVA的新输入/输出(NIO)系统。 ...
Netty4.0学习笔记系列之三是关于构建简单的HTTP服务的教程,这主要涉及网络编程、服务器开发以及Java NIO(非阻塞I/O)的相关知识。Netty是一个高性能、异步事件驱动的网络应用程序框架,它使得开发可伸缩且稳定的...
Java公司培训经典学习笔记是针对Java编程语言进行深入学习的一份宝贵资料,涵盖了从基础到高级的诸多知识点,旨在帮助开发者提升技能,适应企业级项目开发的需求。以下将详细阐述这些笔记中的关键点: 1. **Java...
### Mina2.0学习笔记核心知识点概览 #### 一、Mina入门与环境搭建 **Mina简介** Mina是Apache旗下的一款强大的网络应用框架,专为高性能和高可扩展性网络应用设计,其核心是利用Java NIO技术提供事件驱动的异步API...
博主分享的笔记可能还会深入讨论NIO与传统IO的差异、内存映射文件(MAPPED BUFFER)以及异步非阻塞I/O(AIO)等相关内容,这些都是Java开发者应当掌握的重要技能。 总之,NIO是Java中提升系统性能的重要工具,尤其...
### Java学习笔记知识点总结 #### 一、JVM与内存管理 **1.1 JVM基本概念** - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程...
这些可能涵盖了高级IO特性,如NIO(New IO,Java 1.4引入)和NIO.2(Java 7引入),包括选择器(Selector)、通道(Channel)、缓冲区(Buffer)和文件属性的处理。还有可能涉及网络IO,如Socket和ServerSocket的...