Java-NIO(四):通道(Channel)的原理与获取

  • 通道(Channel):

  由java.nio.channels包定义的,Channel表示IO源与目标打开的连接,Channel类似于传统的“流”,只不过Channel本身不能直接访问数据,Channel只能与Buffer进行交互。通道主要用于传输数据,从缓冲区的一侧传到另一侧的实体(如文件、套接字...),反之亦然;通道是访问IO服务的导管,通过通道,我们可以以最小的开销来访问操作系统的I/O服务;顺便说下,缓冲区是通道内部发送数据和接收数据的端点。

  在标准的IO当中,都是基于字节流/字符流进行操作的,而在NIO中则是是基于Channel和Buffer进行操作,其中的Channel的虽然模拟了流的概念,实则大不相同。

区别 Stream Channel
支持异步 不支持 支持
是否可双向传输数据 不能,只能单向 可以,既可以从通道读取数据,也可以向通道写入数据
是否结合Buffer使用 必须结合Buffer使用
性能 较低 较高

早一代IO操作是由CPU负责IO接口:

新一代DMA授权处理IO接口:

通道(Channel)模式:

  • 通道的获取方法:

java.nio.channels.Channel接口:

  |--FileChannel

  |--SocketChannel

  |--ServerSocketChannel

  |--DatagramChannel

获取通道的方法

1)Java针对支持通道的类提供了getChannel()方法

本地IO:

|--FileInputStream/FileOutputStream

|--RandomAccessFile

网络IO:

|--Socket

|--ServerSocket

|--DatagramSocket

|--Pip.***

2)在JDK1.7中的NIO.2针对各个通过提供了静态方法open()

3)在JDK1.7中的NIO.2的Files工具类的newByteChannel()

4)Channles工具类中提供了静态方法newChannel()。

时间: 2025-01-02 00:19:12

Java-NIO(四):通道(Channel)的原理与获取的相关文章

通道(Channel)的原理与获取

通道(Channel):由 java.nio.channels 包定义 的.Channel 表示 IO 源与目标打开的连接. Channel 类似于传统的“流”.只不过 Channel 本身不能直接访问数据,Channel 只能与 Buffer 进行交互 TestChannel package com.aff.nio; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.File

Java NIO之通道Channel

channel与流的区别: 流基于字节,且读写为单向的. 通道基于快Buffer,可以异步读写.除了FileChannel之外都是双向的.   channel的主要实现: FileChannel DatagramChannel:UDP读写 SocketChannel:TCP读写 ServerSocketChannel 支持scatter/gather(分散和聚集) 分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中.因此,Channel将从Channel

5. 彤哥说netty系列之Java NIO核心组件之Channel

你好,我是彤哥,本篇是netty系列的第五篇. 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Java NIO的核心组件之一--Channel. 思维转变 首先,我想说的最重要的一个点是,学习NIO思维一定要从BIO那种一个连接一个线程的模式转变成多个连接(Channel)共用一个线程来处理的这种思维. 1个Connection = 1个Socket = 1个Channel,这几个概念可以看作是等价的,都表示一个连接,只不过是用在不同的场景中. 如果单从阻塞

Java NIO系列(三) - Channel

前言 上文讲到Java NIO一些基本概念.在标准的IO中,都是基于字节流/字符流进行数据操作的,而在NIO中则是是基于Channel和Buffer进行操作,其中的Channel的虽然模拟了流的概念,实则大不相同. 本文将详细阐述NIO中的通道Channel的概念和具体的用法. Channel和Stream的区别 区别 Stream Channel 是否支持异步 不支持 支持 是否支持双向数据传输 不支持,只能单向 支持,既可以从通道读取数据,也可以向通道写入数据 是否结合Buffer使用 不

Java NIO 之 Socket Channel

在Java NIO中用Channel来对程序与进行I/O操作主体的连接关系进行抽象,这些IO主体包括如文件.Socket或其他设备.简而言之,指代了一种与IO操作对象间的连接关系. 按照Channel接口的定义,Channel只有open和closed两种状态,只有在channel处于open状态下对其操作时才有效,而对closed的channel进行操作会导致抛出异常.相应的Channel接口也仅有isOpen()和close()两种方法. 在Socket编程中,常用的Channel类是Ser

Java NIO之通道

通道 通道基础 通道打开 通道使用 通道关闭 Scatter/Gather 文件通道 文件通道代码示例 Socket通道 Socket通道代码示例 总结 通道 channel用于字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效的传输数据. 通道时一种途径,通过这种途径,可以用最小的总开销来访问操作系统本身的IO服务,缓冲区则是通道内部用于发送和接受数据的断点. 通道基础 顶层接口Channel,次级接口WritableByteChannel.ReadableByteChanne

Java NIO 利用通道完成文件复制(MappedByteBuffer)

相关学习网址: import java.io.IOException;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.nio.channels.FileChannel.MapMode;import java.nio.file.Paths;import java.nio.file.StandardOpenOption; import org.junit.Test; @Testpubl

Java NIO中的Channel接口

Channel  通道,可以将指定文件的部分或全部直接映射成Buffer. 不能直接读写Channel中的数据,Channel只能与ByteBuffer交互. 读数据时,把Channel中的数据映射到ByteBuffer中取出数据使用. 写数据时,把数据放到Buffer中,再把ByteBuffer中的数据写到Channel中. Channel是一个接口,常用的实现类有: FileChannel    用于文件读写 DatagramChannel    用于UDP通信的Channel Server

Java NIO 文件通道使用

读取一个文件的内容,然后写入另外一个文件 public class NioTest4 { public static void main(String[] args) throws Exception { FileInputStream inputStream = new FileInputStream("input.txt"); FileOutputStream outputStream = new FileOutputStream("output.txt");