JAVA NIO简介

    这篇文章主要是介绍下IO和NIO的基本概念以及一些区别,让我们共同学习一下。

一.基本概念

1.IO


IO是主存和外部设备(硬盘、终端和网络)进行数据拷贝的过程。IO是操作系统的底层功能实现,底层通过IO指令完成对数据的操作。

2.java标准IO

java标准IO类库是IO面向对象的一种抽象。基于本地方法的底层实现,无须关注底层实现。输入输出字节流基类:InputStream/

OutputStream,一次传送一个字节,字符流:Reader/Writer,一次一个字符。

3.java NIO简介

java IO(New IO)是从java1.4版本开始引入的一个新的IO API,可以替代标准的java IO API。NIO与原来的IO有同样的

作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的,基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。

NIO特性:

1)为所有的原始类型提供缓存(Buffer)支持。

2)字符集编码解码解决方案。

3)Channel:一个新的原始IO抽象。

4)支持锁和内存映射文件的文件访问接口。

5)提供多路非阻塞式的高伸缩性网络IO。


二.主要区别

1.主要差别见下表

NIOIO
基于通道(Channel)和缓冲区基于字节流和字符流
非阻塞IO阻塞IO
有选择器(监听多个通道事件)无选择器

2.区别详解

1)面向流和面向缓冲

         NIO和IO之间本质的区别,IO是面向流的,NIO是面向缓冲区的。IO面向流意味着每次从流中读一个或多个字节,直至读取所有的字节,它们没有被缓存在任何地方。此外,它们不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。

          java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需要确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。     

2)阻塞与非阻塞

IO的各种流是阻塞的。这意味着,当一个线程调用read()或write()时,该线程被阻塞,直到一些数据被读取完,或数据完全写入。该线程在此期间不能干任何事情了。

NIO是非阻塞模式,一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所有直至数据变的可以读取之前,该线程可以做其他的事情。阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出管道(channel)。

3)选择器(Selectors)

NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来选择通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易管理多个通道。

IO与NIO的区别是很大的,但是他们又有自己的适用范围:

NIO允许你用一个单独的线程或几个线程管理很多个channels(网络的或者文件的),代价是程序的处理和处理IO相比更加复杂。如果你需要同时管理成千上万的连接,但是每个连接只发送少量数据,此时NIO更合适。

如果你只有少量的连接但是每个连接都占有很高的宽带,同时发送很多数据,传统的IO会更合适。

4)通道和缓冲区

java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。

Buffer:表示打开到IO设备(例如:文件、套接字)的连接。

    是一块连续的内存块

    是NIO数据读或写的中转地

Channel:

    数据的源头或者数据的目的地

    用于向Buffer提供数据或者读取Buffer数据,Buffer对象的唯一接口。

    异步IO支持

若需要使用NIO系统,需要获取用于IO设备的通道以及用于容纳数据的缓冲区,然后操作缓冲区,对数据进行处理。

Channel负责传输,Buffer负责存储。








































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值