java nio理解(2)

原创 2016年08月28日 15:32:37

通道(Channel)


  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示: 
 

Channel的实现 

这些是Java NIO中最重要的通道的实现: 

  • FileChannel:从文件中读写数据。
  • DatagramChannel:能通过UDP读写网络中的数据。
  • SocketChannel:能通过TCP读写网络中的数据。
  • ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
基本的 Channel 示例 

下面是一个使用FileChannel读取数据到Buffer中的示例: 

Java代码 
  1. RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt""rw");  
  2. FileChannel inChannel = aFile.getChannel();  
  3.   
  4. ByteBuffer buf = ByteBuffer.allocate(48);  
  5.   
  6. int bytesRead = inChannel.read(buf);  
  7. while (bytesRead != -1) {  
  8.   
  9. System.out.println("Read " + bytesRead);  
  10. buf.flip();  
  11.   
  12. while(buf.hasRemaining()){  
  13. System.out.print((char) buf.get());  
  14. }  
  15.   
  16. buf.clear();  
  17. bytesRead = inChannel.read(buf);  
  18. }  
  19. aFile.close();  

注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。 

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示: 
版权声明:本文为博主原创文章,未经博主允许不得转载。

我所理解的Java NIO

科技优家 2017-05-03 15:23 上回介绍了超简易日志类,但他有诸多的局限性,注定了不能作为一个网站的日志类。 那什么样的日志类才能用于网站呢。首先来假设三个场景: 场景1:我的网站per...
  • u011277123
  • u011277123
  • 2017年05月04日 10:13
  • 141

Java NIO理解与使用

Netty的使用或许我们看着官网user guide还是很容易入门的。因为java nio使用非常的繁琐,netty对java nio进行了大量的封装。对于Netty的理解,我们首先需要了解NIO的原...
  • qq_18860653
  • qq_18860653
  • 2016年11月30日 14:02
  • 2071

Java NIO怎么理解通道和非阻塞?

nio引入了buffer、channel、selector等概念。 通道相当于之前的I/O流。 “通道”太抽象了。java解释不清的东西只能看它底层是怎么解释的——操作系统的I/O控制,通道控制方...
  • woorh
  • woorh
  • 2013年01月29日 21:08
  • 3420

关于Java的一些NIO框架的一点想法

闲着有点无聊想写点东西。 问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina  xSocket Grizzly 等等哪个比较好?   在这里写一下自己的感受,也算是...
  • shuyun123456789
  • shuyun123456789
  • 2017年01月09日 21:25
  • 694

Java NIO系列4:通道和选择器

前言今天加班回来,终于有时间继续更新NIO的文章了。在前一篇文章我们讲解了缓冲区的知识,并通过代码演示了如何使用缓冲区的API完成一些操作。这里要讲的通道于缓冲区关系密切,简单来说,缓冲区是填充数据的...
  • u011116672
  • u011116672
  • 2016年05月28日 23:21
  • 9535

java nio http服务器(3)简单的Servlet容器

Servlet容器中放着我们所有要访问的Servlet
  • maosijunzi
  • maosijunzi
  • 2014年07月14日 18:51
  • 3286

Java NIO(New IO) 通俗易懂简明教程

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。本系列教程将有助于你学习和理解Java NIO。...
  • u011263794
  • u011263794
  • 2016年06月30日 13:12
  • 3203

Java NIO学习总结一(非阻塞特性)

NIO(New IO)是从Java 1.4版开始引入的新的IO API,其与标准的JAVA IO API的差异本质上体现在资源的利用方式上。可以从现实中餐厅排队的例子来理解这一点,饭点到了,某顾客选择...
  • c_craft
  • c_craft
  • 2015年12月29日 11:09
  • 884

java nio&netty系列之二reactor模型基础

上一篇章介绍了下NIO的基础,并且也给出了一个简单的代码示例,但是如果想享受NIO带来的高速的快感,就得使用多线程编程了。那么在使用多线程编程之前,有一些关于多线程的东西想分享下: 一、关于多线...
  • guomei
  • guomei
  • 2014年05月07日 01:07
  • 947

JAVA1.7 NIO.2 入门,第 1 部分: 异步通道 API

异步通道 提供支持连接、读取、以及写入之类非锁定操作的连接,并提供对已启动操作的控制机制。Java 7 中用于 Java Platform(NIO.2)的 More New I/O APIs,通过在 ...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年04月03日 22:01
  • 2495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java nio理解(2)
举报原因:
原因补充:

(最多只允许输入30个字)