java NIO详解(1)--概念及核心组件
来源:互联网 发布:长沙unity3d招聘 编辑:程序博客网 时间:2024/06/10 23:13
- 组成
- 1 Channel 和 Buffer
- 12 Selector
- 组件示例
- 21 Channel的实现
- 2 基本的 Channel 示例
- 组成
1. 组成
Java NIO
由以下几个核心部分组成:
Channels
Buffers
Selectors
虽然Java NIO
中除此之外还有很多类和组件,但在我看来,Channel
,Buffer
和 Selector
构成了核心的API。其它组件,如Pipe
和FileLock
,只不过是与三个核心组件共同使用的工具类。
1.1 Channel 和 Buffer
基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。这里有个图示:
Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。
与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。本教程其它章节与它们相关的地方我会进行解释。
以下是Java NIO里关键的Buffer实现:
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。
Java NIO 还有个 MappedByteBuffer
,用于表示内存映射文件, 我也不打算在概述中说明。
1.2 Selector
Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。
这是在一个单线程中使用一个Selector处理3个Channel的图示:
要使用Selector
,得向Selector
注册Channel
,然后调用它的select()
方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。
2. 组件示例
Java NIO的通道类似流,但又有些不同:
- 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
- 通道可以异步地读写。
- 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:
2.1 Channel的实现
这些是Java NIO中最重要的通道的实现:
FileChannel
: 从文件中读写数据。DatagramChannel
:能通过UDP读写网络中的数据。SocketChannel
:能通过TCP读写网络中的数据。ServerSocketChannel
:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
2.2 基本的 Channel 示例
下面是一个使用FileChannel读取数据到Buffer中的示例:
public static void main(String[] args) throws Exception { RandomAccessFile aFile = new RandomAccessFile("nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf); while (bytesRead != -1) { System.out.println("Read " + bytesRead); buf.flip(); while(buf.hasRemaining()){ System.out.print((char) buf.get()); } buf.clear(); bytesRead = inChannel.read(buf); } aFile.close();}
/*****结果打印文件中的内容*****/Read 8nio test/*****当内容过多时*****/Read 480123456789012345678901234567890123456789Read 100123456789
注意 buf.flip()
的调用,首先读取数据到Buffer
,然后反转Buffer
,接着再从Buffer
中读取数据。下一节会深入讲解Buffer
的更多细节。
- java NIO详解(1)--概念及核心组件
- Java NIO 详解(概念)
- Java NIO 核心组件学习笔记
- Java NIO 核心组件学习笔记
- Java NIO 核心组件学习笔记
- Java NIO 核心组件学习笔记
- NIO学习系列:核心概念及基本读写
- NIO学习系列:核心概念及基本读写
- NIO学习系列:核心概念及基本读写
- java阻塞和NIO概念详解
- Java NIO笔记(第二弹:Java NIO三大基本组件详解)
- (一)核心组件详解
- java nio详解1
- Java NIO详解及实例和源码下载(一)
- Java NIO详解及实例和源码下载(二)
- Java NIO教程(一) 核心概述
- Java核心知识点-NIO
- Java核心知识点-NIO
- vue 获取当前点击dom
- 大白菜装windows7系统流程
- UML类图关系
- 拓扑排序-简单实现
- openjudge 1805 碎纸机
- java NIO详解(1)--概念及核心组件
- JSON对象与java对象转换
- unity的mono没有点出来功能
- css属性的继承
- Mybatis匹配Mapper报no getter错误
- git使用笔记
- Boost 的 STL Container 切割工具(上):split
- IOS MD5加密
- 初识Laravel 之目录结构