美文网首页技术杂谈
Java NIO Channel 通道

Java NIO Channel 通道

作者: 香芋牛奶面包 | 来源:发表于2019-02-16 16:18 被阅读14次

引言

上一篇文章主要介绍了Java NIO Buffer的使用及内部实现原理,本期我们将会认识到Java NIO 另一个非常重要的特性Channel(通道)

对比传统IO流

在认识Java NIO Channel通道之前,我们有必要对比一下NIO Channel与传统I/O流的区别,以及它的优势在哪里:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的
  • 通道可以异步地读写。(不会阻塞进程)
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入(面向缓冲区)。

Channel 分类

下面列举的是JAVA NIO Channel的一些主要实现:

  • FileChannel 文件通道
  • SocketChannel 通过TCP读写网络中的数据。
  • ServerSocketChannel TCP服务端,可以读写网络中的数据,可以监听新进来的TCP连接
  • DatagramChannel 通过UDP读写网络中的数据

接下来我将主要对文件通道Socket通道的使用做分析

文件通道 FileChannel

我们无法直接打开一个FileChannel,需要通过使用一个InputStreamOutputStreamRandomAccessFile来获取一个FileChannel实例。并且FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下

读写数据

下面是通过RandomAccessFile打开FileChannel进行数据读写的示例:

写数据至指定文件

RandomAccessFile file = new RandomAccessFile("hello.txt", "rw");
FileChannel fileChannel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(512);
// 将要写的数据写入缓冲区
buffer.put("见到你真好".getBytes("utf-8"));

// 切换缓冲区至可读模式
buffer.flip();

// 开始写入文件
fileChannel.write(buffer); // 返回当前写入的字节数
file.close();
fileChannel.close();

从文件中读取数据

RandomAccessFile file = new RandomAccessFile("hello.txt", "rw");
FileChannel fileChannel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(512);
fileChannel.read(buffer);

// 切换缓冲区至可写模式
buffer.flip();
byte data [] = new byte[buffer.limit()];
// 将数据写至 byte数组
buffer.get(data);
System.out.println(new String(data));
file.close();
fileChannel.close();

Socket 通道

同样,相对于传统BIOSocketServerSocketNIO也提供了对TCP/IP协议封装的套接字通道:

  • SocketChannel
  • ServerSocketChannal

下面我们来看一下它们的基本使用

SocketChannel 打开通道

// 打开一个通道
SocketChannel channel = SocketChannel.open();

// 与Server建立连接
channel.connect(new InetSocketAddress("127.0.0.1", 8890));

ServerSocketChannel 打开通道接受连接

// 打开通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
// 绑定端口
serverSocketChannel.socket().bind(new InetSocketAddress(8890));
// 接受一个Socket连接 默认是阻塞模式
SocketChannel channel = serverSocketChannel.accept();

要点

SocketChannel,ServerSocketChannel 也可以设置成非阻塞模式,设置成非阻塞模式的话,acceptreadwrite 方法会立即返回, 因此需要我们在代码不断的轮询去判断连接和数据是否就绪

尾言

本篇文章主要介绍了Java NIOChannel(通道)的使用,其使用与传统I/O流相比其实更加的易用。下期将会介绍Java NIO的核心Selector选择器的基本使用

相关文章

  • Java NIO Channel

    Channel(通道) 定义 Channel(通道)定义在java.nio.channels包中。Channel表...

  • Java NIO(4) - 通道(1)

    3.6 通道(channel)简介 通道(Channel):由 java.nio.channels 包定的。Cha...

  • Java NIO——通道Channel

    Channel 通道的简介 通道( Channel):由 java.nio.channels 包定义的。 Chan...

  • NIO 之 Channel

    可参考之前写过的文章:NIO 之 Channel实现原理 概述 通道( Channel)是 java.nio 的主...

  • Java NIO(2) - 缓冲区(Buffer)

    3. 缓冲区(Buffer)和通道(Channel) Java NIO系统的核心在于:通道(Channel)和缓冲...

  • NIO

    一、Java NIO 概述 二、Java NIO vs. IO 三、通道(Channel): 四、缓冲区(Buff...

  • Java NIO

    java Nio Selector 选择器Buffer 缓冲器Channel 通道 Selector是NIO的核心...

  • java NIO(一)Channel

    java NIO(一)Channel nio中的channel与流的区别在于,流的读写通常是单向的,而通道可以异步...

  • Java NIO 通道(Channel)

    Java NIO 通道(Channels )与流类似但也有一些区别: 您可以读取和写入通道,流通常是单向的(读或写...

  • [Java NIO]通道Channel

    一.通道介绍 1.1 通道(channel) 用于在字节缓冲区和位于通道的另一测的实体(通常是文件或套接字)之间有...

网友评论

    本文标题:Java NIO Channel 通道

    本文链接:https://www.haomeiwen.com/subject/gtmjdqtx.html