`
greemranqq
  • 浏览: 967263 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

nio ---基本概念和使用

阅读更多

一、序言 

       关于NIO 相关介绍也很多了,这里主要目的还是通过自己的学习,分享一部分自己的理解,计划从基本概念到原理、到使用、到一些源码底层的分析,也回顾和总结自己的学习历程,今天先介绍概念。

 

 

二、NIO介绍

       NIO 从JDK1.4 提出的,介绍是为了弥补IO的不足,提供了更高效的方式,提出一个通道(channel)的概念。源于IO的不足,还在在于它始终以流的形式对数据的传输和接受,当然NIO也差不多,但是NIO 提供了一种内存映射数据的方式,

       简单的理解是:IO 原来是用固定的水管传输和接受水源,NIO可以提供一种用桶的方式传输和接受水源。比如在取水过程中,IO可以让接水,NIO可以直接一次打满一桶水,从效率上看,很明显的,当然这仅仅是一个好处,其他的我们后面解释。

 

三、通道和缓冲区

       缓冲区(buffer):这个很好理解,即使IO也有这个概念,就就像我们读、写文件的时候,不会拿到一个字节,就对文件进行读、写操作,一般情况会建立一个缓存区数组,比如new byte[1024*4],然后将缓冲区的数据一次操作。在NIO中这里的原理其实一样的,可能细节实现上有些区别。

 

       通道(channle): 这玩意儿,它需要从缓冲区获取数据,缓冲区也可以从通道里面提取数据,相当于我另外开辟了一个空间来存放我的数据,而且是双向的,对里面数据的掌控性也更好,好吧, 这些都是空话,实践出真知,我们后面实践的时候再对它进行细致的描述。

 

 

四、JDK 和 代码示例

        全理论化的东西,是很烦人,即使写得很大白话,还是代码看着亲切。

        1.先看看buffer 缓冲区: 这个其实也是装老的byte[] ,先看看我们将文件流放到byte 数组的写法区别

       

		// 这是原始方式之一
                FileInputStream is = new FileInputStream(name);
		// 这个区间可以自己定义
		byte[] buff = new byte[is.available()];
		is.read(buff);
		return buff;

   

		// 这是新方式
		FileInputStream f = new FileInputStream(name);
		// 获得通道,这里用了API 没公布的一些类,组合而成,有时间可以去看                          // 看源码
		FileChannel channel = f.getChannel();
		// 创建一个缓冲区
		ByteBuffer buffer = ByteBuffer.allocate(f.available());
                // 从通道读取放入缓冲区
		channel.read(buffer);
                // 注意,这里如果是分配的直接缓冲区 ,此方法会出错的,可以看源码
                byte[] bytes = buffer.array();

   

    上面的例子,其实你也不知道有啥好处,仅仅熟悉一下必要的步骤:通道<---> 缓冲区

    下面我们来看看文件复制的操作:

     

	// 原始方式的文件复制
	public static void copyFile(String orgFile,String targetFile) throws Exception{
		FileInputStream in = new FileInputStream(orgFile);
		FileOutputStream out = new FileOutputStream(targetFile);
		byte[] buff = new byte[1024*8];
		int len = 0;
		while((len = in.read(buff)) != -1){
			out.write(buff,0,len);
		}
	}

    

    

  // 这是利用通道 缓冲区 的方式,和上面差不多
   public static void copyFile2(String orgFile,String targetFile) throws Exception{
		FileInputStream in = new FileInputStream(orgFile);
		FileOutputStream out = new FileOutputStream(targetFile);
		FileChannel  orgChannel = in.getChannel();
		FileChannel tarChannel = out.getChannel();
		ByteBuffer buffer = ByteBuffer.allocate(1024*8);
		int len = 0;
		while((len = orgChannel.read(buffer)) != -1){
			buffer.flip();
			tarChannel.write(buffer);
			buffer.clear();
		}
	}

 

    

	// 这个是直接用API 的方式
	public static void copyFile3(String orgFile,String targetFile) throws Exception{
		FileInputStream in = new FileInputStream(orgFile);
		FileOutputStream out = new FileOutputStream(targetFile);
		FileChannel  orgChannel = in.getChannel();
		FileChannel tarChannel = out.getChannel();
		orgChannel.transferTo(0, orgChannel.size(), tarChannel);
	}

 

     上面测试我用了一个大于JVM 限制的文件复制,结果是最后一种最快啦~。~(小文件就算了)

      关于通道复制速度的解释:http://www.ibm.com/developerworks/cn/java/j-zerocopy/ 很详细

 

     2.关于通道这个东西我的理解是:就像给我们数据源和地点之间加了一个大的用于传输的通道,这不是简单的让字节流通过的通道,而是里面允许我们做更多的检测、加速、返回等等操作的通道,后面分析源码的时候再体会吧。

     

     关于缓冲区要说到的几个元素和方法,比如我们刚才用到的flip和clear。首先要理解这个缓冲区其实就是一个byte[] 数组的空间,里面有这几个元素:

     Capacity:这表示容量,也就是说我数组的最大长度

    position: 相当于指针,当我们操作数组里面元素的时候,这个会跟着移动,记录我们的位置,方便我们记录下次要用数据。

    mark:标记位置,和事务的回滚位置差不多,相当于我们在这个位置记录一下,下一次我可以返回到这个位置干事。

    limit :我们只能读操作到位置,比如我10长度的数组,只有前面6个又数据,那么我就设置只能操作前面6个有效的。

   关于基本的东西可以看看源码,很容易,也可以看看这文章:

   http://www.ibm.com/developerworks/cn/education/java/j-nio/section5.html

 

小结:

     1.这里仅仅介绍下NIO 的使用基本情况,没有深入,它的优势还在于它的不阻塞模式,和Selector管理模式,后面会根据原理和源码分析。

    

  

分享到:
评论

相关推荐

    Java NIO核心概念总结篇

    这是学习Java NIO过程中总结的核心概念,里面包含了基本的知识点,详细知识点也可以查看我的博客:pcwl_java里的Java NIO篇

    nio入门 IBM教材,pdf格式

    为了最大程度地从这里的讨论中获益,您应该理解基本的 Java 编程概念,如类、继承和使用包。多少熟悉一些原来的 I/O 库(来自 java.io.* 包)也会有所帮助。 虽然本教程要求掌握 Java 语言的工作词汇和概念,但是不...

    NIO学习系列:核心概念及基本读写

    NULL 博文链接:https://zhangshixi.iteye.com/blog/679959

    java nio ppt

    java nio 相关 ppt,介绍了 java nio 的基本概念以及和其他 io 的区别

    JAVA Nio 学习探究

    包含NIO核心概念、基本文件读写、缓冲区内部实现机制、异步IO、缓冲区更多特性探究、文件锁与字符集

    Java的学习之路,学习JavaEE以及框架时候的一些项目,结合博客和源码,让你受益匪浅,适合Java初学者和刚入门开始学框架者

    - **语法和基本概念**:变量、数据类型、运算符、控制结构、数组、字符串等。 - **面向对象编程(OOP)**:类和对象、继承、封装、多态、接口和抽象类。 - **异常处理**:try-catch 块、throws 关键字、自定义异常。...

    java NIO学习系列 笔记

    Contents: 1 核心概念以及基本读写 2 缓冲区的实现机制 3 连网与异步IO 4 分散和聚集IO 5 文件锁定

    Java NIO介绍

    概述 基本概念 基本读写 缓冲区内部机制 异步IO 总结

    Java SE实践教程 源代码 下载

    第6章 三头六臂——线程和同步的基本概念 109 6.1 讲解 110 6.1.1 什么是线程 110 6.1.2 创建线程 110 6.1.3 线程的生命周期 112 6.1.4 线程的优先级 114 6.1.5 中断线程 115 6.1.6 线程组 116 6.1.7 处理未...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    第6章 三头六臂——线程和同步的基本概念 109 6.1 讲解 110 6.1.1 什么是线程 110 6.1.2 创建线程 110 6.1.3 线程的生命周期 112 6.1.4 线程的优先级 114 6.1.5 中断线程 115 6.1.6 线程组 116 6.1.7 处理未...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    第6章 三头六臂——线程和同步的基本概念 109 6.1 讲解 110 6.1.1 什么是线程 110 6.1.2 创建线程 110 6.1.3 线程的生命周期 112 6.1.4 线程的优先级 114 6.1.5 中断线程 115 6.1.6 线程组 116 6.1.7 处理未...

    Java高并发实战_java高并发_高并发_

    第1章主要介绍了并行计算中相关的 些基本概念, 树立读者对并行计算的基本认识;介绍了两个重要的并行性能评估定律, 以及 Java 内存模型 JMM。第2章介绍了 Java 并行程序开发的基础, 包括 Java 中 Thread 的基本...

    JavaNIOProxyService

    一个代理服务,用于演示 Java NIO 和React堆模式的基本概念。 要运行该程序,请在位于 src/main/resources 目录内的 config.properties 文件中填充必要的属性,然后使用您的 IDE 运行 ListeningIOReactor 类。 ...

    Java服务器端开发面试.doc

    文件读取, 字节流和字符流, 流的概念, reader, stream等; NIO(通道,缓冲区,选择器) Java服务器端开发面试题篇2 thread, start(), run() 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口 线程...

    Java版水果管理系统源码-Java:Java笔试面试题整理

    基本概念 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 BS 与 CS 的联系与区别 Cookie 和 Session 的区别 fail-fast 与 fail-safe 机制有什么区别 IOC的优点是什么 IO 和 NIO的...

    疯狂JAVA讲义

    10.4.3 catch和throw同时使用 371 10.4.4 异常链 373 10.5 Java的异常跟踪栈 374 10.6 异常处理规则 376 10.6.1 不要过度使用异常 377 10.6.2 不要使用过于庞大的try块 378 10.6.3 避免使用Catch All语句 378 ...

    Java IO应届生培训讲义

    个人给应届生培训用的讲义,主要是以Java IO为主题,包括IO的基本概念、IO模型、Java BIO ,NIO, NIO2。分享下

    Java思维导图xmind文件+导出图片

    IO 的基本概念、NIO、AIO、BIO深入分析 NIO的核心设计思想 Netty产生的背景及应用场景分析 基于Netty实现的高性能IM聊天 基于Netty实现Dubbo多协议通信支持 Netty无锁化串行设计及高并发处理机制 手写实现多...

    java_study_note:个人学习笔记

    mysql相关基本概念以及基本使用。 进行中设计模式进行中虚拟机根据宋红康老师视频完成。正在学习中篇Java框架 SSM笔记。SpringMVC未整理完成springBoot基础使用玛文并不是maven的详细笔记。常用工具git常用命令待...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    5.7并行搜索 5.9并行算法:矩阵乘法 5.10准备好了再通知我:网络nio 5.11读完了再通知我:aio 5.9并行算法:矩阵乘法 5.10准备好了再通知我:网络NIO 5.11读完了再通知我:AIO 5并行模式与算法 实战Java高并发程序...

Global site tag (gtag.js) - Google Analytics