Java NIO 第一章节
2015-11-30 17:20
561 查看
Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。
Channel 和 Buffer
基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。这里有个图示:Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:FileChannelDatagramChannelSocketChannelServerSocketChannel正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。本教程其它章节与它们相关的地方我会进行解释。以下是Java NIO里关键的Buffer实现:ByteBufferCharBufferDoubleBufferFloatBufferIntBufferLongBufferShortBuffer这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。Java NIO 还有个 MappedByteBuffer,用于表示内存映射文件, 我也不打算在概述中说明。Selector
Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。这是在一个单线程中使用一个Selector处理3个Channel的图示:要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。2. channelJava NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:Channel的实现
这些是Java NIO中最重要的通道的实现:FileChannelDatagramChannelSocketChannelServerSocketChannelFileChannel 从文件中读写数据。DatagramChannel 能通过UDP读写网络中的数据。SocketChannel 能通过TCP读写网络中的数据。ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。基本的 Channel 示例
下面是一个使用FileChannel读取数据到Buffer中的示例:RandomAccessFile aFile = new RandomAccessFile("data/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();
<span style="color: rgb(102, 102, 102); font-size: 14px; line-height: 35px;">注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。</span>
相关文章推荐
- JAVA: 为什么要使用"抽象类"? 使用"抽象类"有什么好处?
- SpringMvc+maven+resin
- spring中整合quarz
- 深入分析 Java 中的中文编码问题
- Cassandra + Eclipse + Hadoop
- Struts2中解决中文乱码问题
- Maven小技巧 - eclipse.m2e的插件运行定义
- Spring学习之整合Hibernate
- Java多态
- Java抽象类和接口概念和特点理解
- Struts2返回JSON对象的方法总结
- java-map按key升序排序
- Hbase Java客户端示例
- Lucene的“helloword” ——最简单的建立、搜索索
- javaSE(14)(字节流与字符流)
- Spring4.2.3+Hibernate4.3.11整合( IntelliJ maven项目)(使用Annotation注解)(Junit测试类)
- Java内功提升之static的使用
- 传智播客Java学习路线图
- Java生产者消费者
- 分布式事务——Spring4+Hibernate4+atomikos