1.I/O 输入输出流
(1) 指的是计算机与外界,或者程序与计算机之间数据交换的接口。

(2) 在java编程中,使用 流(Stream) 的方式完成I/O , 所有的I/O都被视为单个字节的移动。
通过一个Stream对象,一次移动一个字节。
Stream用于将字节转换为对象,或将对象转为字节。

(3)NIO和I/O有同样的作用和目的,但是它使用不同的方式,块 I/O

(4)NIO将最耗时的I/O操作(即最耗时的填充和读取缓冲区),转移回操作系统,因而可以极大地提高速度。

2.流与块的比较
(1) I/O和NIO最主要的区别的是数据打包和传输方式的不同。I/O以流的方式传输数据,NIO以块的方式传输数据
(2) 面向流
缺点:
流I/O一次一个字节(8 bit)读取数据。一个输入流产生一个字节数据,一个输出流消费一个字节的数
据,所以面向流的I/O相当慢。
优点:
为流式数据创建过滤器非常容易,链接几个过滤器,比如上面套一个Buffer缓存
(3) 面向块
一个面向块的I/O以块的形式处理数据。每一个操作都在一步中产生或消费一个数据块
优点:按块处理,比按字节处理效率要快的多
缺点:缺少流的优雅性和简单性

(4) 流的读取是单向的,而通道是双向的

3.通道和缓冲区
(1) 通道是原I/O中流的模拟,数据到任何地方都必须通过一个Channel对象来实现。
Channel是一个对象,可以通过它读取和写入数据,其作用类似于I/O中的Stream。程序读取数据时,先把数据从通道读入缓冲区,再从缓冲区读数据。
通道是双向的,而Stream是单向的,只在一个方向上移动(InputStream , OutputStream) ,而通道可以用于读、写,或者同时读写。

(2) 缓冲区实质上是一个容器对象,发送给一个通道的所有对象都必须首先放到缓冲区;同样的,从通道中读取任何数据都要读到缓冲区中。
Buffer是一个对象,它用于存放要写入或者刚读出的对象。在NIO中所有的数据都是用缓冲区处理的,当读取数据的时候,它是读取到缓冲区;
当写入数据的时候它是写入到缓冲区。
缓冲区实际是一个数组(通常是一个字节数组ByteBuffer,也可以是其它类型的),一个ByteBuffer可以在其底层字节上进行get/set操作。


4.Buffer内部细节
Buffer有3个属性描述其在任意时刻的状态,缓冲区Buffer其实是一个数组

(1) position
position变量跟踪已经读写了多少数据,比如一个缓冲区长度为10,往里写了3个字节,那其position值就是3,即第4个元素
如果从缓冲区往外读数据,即把数据写入Channel,如读了5个字节,position值为5,即第6个元素

(2) limit
limit表示当前缓冲区有多大容量能放入数据,或者当前缓冲区有多少数据等待被取出。
a.比如一个Buffer的长度是10,其limit就是10
b.当往里放5个元素时,position是5,其limit还是10,limit这时是不会变的
c.当从Buffer中往外取的时候,先调用buffer的flip()方法,其作用是,将limit值置为5,即当前position的值,position置为0

(3) capacity
capacity指定了缓冲区底层数组的容量,其值大小不会变。limit不会大于capacity

5.Buffer方法
(1) flip() , 将limit值置position的值,position置为0

(2) clear(),将limit置为和capacity相同,将position置为0,(相当于清空缓冲区,重新接收值)

(3) get() ,从Buffer读取数据

(3) put(),往Buffer写数据

6.直接缓冲区

(1) 直接缓冲区是一种为了加快I/O速度,而以一种特殊方式分配其内存的缓冲区。
给定一个直接字节缓冲区,Java虚拟机,将尽最大努力直接对它执行本机I/O操作,也就是说,jvm会在每一次调用底层操作系统的本机I/O操作
之前或之后,尝试避免将缓冲区的内容,拷贝到一个中间缓冲区中
看源码??

7.

nio的更多相关文章

  1. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  2. BIO\NIO\AIO记录

    IO操作可以分为3类:同步阻塞(BIO).同步非阻塞(NIO).异步(AIO). 同步阻塞(BIO):在此种方式下,用户线程发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后, ...

  3. 支撑Java NIO 与 NodeJS的底层技术

    支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...

  4. Java I/O and NIO [reproduced]

    Java I/O and NIO.2---Five ways to maximize Java NIO and NIO.2---Build more responsive Java applicati ...

  5. JAVA NIO学习笔记1 - 架构简介

    最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...

  6. Java NIO概述

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...

  7. JAVA NIO Socket通道

      DatagramChannel和SocketChannel都实现定义读写功能,ServerSocketChannel不实现,只负责监听传入的连接,并建立新的SocketChannel,本身不传输数 ...

  8. JAVA NIO FileChannel 内存映射文件

      文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...

  9. java nio系列文章

    java nio系列教程 基于NIO的Client/Server程序实践 (推荐) java nio与并发编程相关电子书籍   (访问密码 48dd) 理解NIO nio学习记录 图解ByteBuff ...

  10. (转)NIO与AIO,同步/异步,阻塞/非阻塞

    原文地址: http://www.cnblogs.com/enjoy-ourselves/p/3793771.html 1.flip(),compact(),与clear()的使用 flip()内部实 ...

随机推荐

  1. hdu2588 GCD (欧拉函数)

    GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数.  (文末有题) 知 ...

  2. grunt快速入门

    快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...

  3. FastCgi与PHP-fpm关系

    1 CGI  (1)什么是CGI: CGI(Common Gateway Interface)公共网关接口, 是WWW技术中最重要的技术之一,有着不可替代的重要地位, CGI是外部应用程序(CGI程序 ...

  4. 从点云到网格(三)Poisson重建

    Possion重建是Kazhdan等2006年提出的网格重建方法[1].Possion重建的输入是点云及其法向量,输出是三维网格.Poisson有公开的源代码[2].PCL中也有Poisson的实现. ...

  5. const 引起的BUG

    今天白天出现了碰见了一个问题,隐藏得比较深,这里记录一下. 初衷很简单,就是要更改改一个数据库的链接名,这个链接名是放在数据层public const string connDB="conn ...

  6. Firefox默认英文修改中文

    对于firefox,中文还是看着顺眼,为了自己的顺心.动起手来,自力更生,丰衣足食! 01.确定Linux的firefox版本 firefox -v 02.下载对应版本的中文语言包 http://ft ...

  7. selector 使用说明

    android:state_pressed=["true" | "false"]//是否触摸 android:state_focused=["true ...

  8. 一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件

    #!/bin/env python # -*- coding: utf-8 -*- import datetime import smtplib import os,sys from email.mi ...

  9. 【配置】检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)。

      ×   检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式). 我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 5 ...

  10. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...