引子

自从

JDK 1.4以后,我们迎来了java.nio这个包。那这个包有什么奥妙和作用呢?

下面我们就来简单介绍一下。

I/O简介

I/O或者输入/输出指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任何计算机系统都非常关键,因而所有I/O的主体实际上是内置在操作系统中的。单独的程序一般是让系统为它们完成大部分的工作。

Java编程中,直到最近一直使用 流 的方式完成I/O。所有I/O都被视为单个的字节的移动,通过一个称为Stream的对象一次移动一个字节。流I/O用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换回对象。

NIO与原来的I/O有同样的作用和目的,但是它使用不同的方式块I/O。正如您将在本教程中学到的,块I/O的效率可以比流I/O

高许多。

为什么要使用NIO?

NIO

的创建目的是为了让Java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO将最耗时的I/O操作(即填充和提取缓冲区)

转移回操作系统,因而可以极大地提高速度。

流与块的比较

原来的I/O库(在java.io.*中)与NIO最重要的区别是数据打包和传输的方式。正如前面提到的,原来的I/O以流的方式处理数据,而NIO以块的方式处理数据。

面向流 的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的I/O通常相当慢。

一个 面向块 的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O

所具有的优雅性和简单性。

集成的I/O

在JDK 1.4中原来的I/O包和NIO已经很好地集成了。java.io.*已经以NIO为基础重新实现了,所以现在它可以利用NIO的一些特性。例如,java.io.*包中的一些类包含以块的形式读写数据的方法,这使得即使在更面向流的系统中,处理速度也会更快。

也可以用NIO库实现标准I/O功能。例如,可以容易地使用块I/O一次一个字节地移动数据。但是正如您会看到的,NIO还提供了原I/O

包中所没有的许多好处。

概述

通道 和 缓冲区 是NIO中的核心对象,几乎在每一个I/O操作中都要使用它们。

通道是对原I/O包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个Channel对象。一个Buffer实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。

接下来,您会了解到NIO

中通道和缓冲区是如何工作的。

什么是缓冲区?

Buffer是一个对象, 它包含一些要写入或者刚读出的数据。 在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别。在面向流的I/O中,您将数据直接写入或者将数据直接读到Stream对象中。

在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NIO中的数据,您都是将它放到缓冲区中。

缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/

写进程。

缓冲区类型

最常用的缓冲区类型是ByteBuffer。一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。

ByteBuffer不是NIO中唯一的缓冲区类型。事实上,对于每一种基本Java类型都有一种缓冲区类型:

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

每一个Buffer类都是Buffer接口的一个实例。 除了ByteBuffer,每一个Buffer类都有完全一样的操作,只是它们所处理的数据类型不一样。因为大多数标准I/O操作都使用ByteBuffer,所以它具有所有共享的缓冲区操作以及一些特有的操作。

现在您可以花一点时间运行UseFloatBuffer.java,它包含了类型化的缓冲区的一个应用例子。

什么是通道?

Channel是一个对象,可以通过它读取和写入数据。拿NIO与原来的I/O做个比较,通道就像是流。

正如前面提到的,所有数据都通过Buffer

对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

通道类型

通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类), 而 通道 可以用于读、写或者同时用于读写。

因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在UNIX

模型中,底层操作系统通道是双向的。

java nio doug_Java NIO简介相关推荐

  1. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )

    文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...

  2. Java NIO、NIO.2学习笔记

    http://www.cnblogs.com/littlehann/p/3720396.html 相关学习资料   http://www.molotang.com/articles/903.html ...

  3. java 修改最大nio连接数_携程基于Quasar协程的NIO实践

    IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题.目前Java项目对接NIO的方式主要依靠回调,代码复杂度高,降低了代码可读性与可 ...

  4. java 中的NIO

    NIO 概念 NIO: New IO. Non-Blocking IO. NIO 是JDK1.4的时候出现了⼀个新的IO, ⽤来替代传统的IO流. NIO与IO有着相同的功能, 但是操作的⽅法不同.J ...

  5. NIO详解(十三):Java IO 和NIO 总结

    1. 概述 下面总结了Java NIO和IO之间的主要差别 IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 2. Java IO和 NIO的主要区别 2.1 面向流和面向缓冲区 Ja ...

  6. Five ways to maximize Java NIO and NIO.2--转

    原文地址:http://www.javaworld.com/article/2078654/java-se/java-se-five-ways-to-maximize-java-nio-and-nio ...

  7. 【学习笔记】JAVA IO与NIO(new IO)的对比与不同IO模型的理解

    JAVA IO 分类: 几种IO 模型 1. 阻塞 IO 模型 2. 非阻塞 IO 模型 JAVA NIO 多路复用 IO 模型(即Java中的NIO) JAVA IO 思维导图: 分类: 按照流的方 ...

  8. java中io.nio.aio_Java中网络IO的实现方式-BIO、NIO、AIO

    在网络编程中,接触到最多的就是利用Socket进行网络通信开发.在Java中主要是以下三种实现方式BIO.NIO.AIO. 关于这三个概念的辨析以前一直都是好像懂,但是表达的不是很清楚,下面做个总结完 ...

  9. java 修改最大nio连接数_关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道?...

    关于同步.阻塞的知识我之前的文章有介绍,所以关于流用到这些概念与之前多线程用的概念一样. 下面具体来看看java中的几种流 IO/BIO BIO就是指IO,即传统的Blocking IO,即同步并阻塞 ...

最新文章

  1. 修改CentOS yum源
  2. git创建与管理远程分支
  3. netty单片机通讯_SSM+Netty实现软硬件通信,真实项目案例
  4. leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)
  5. SAP Spartacus FeaturesConfig
  6. 12个关键词,告诉你到底什么是机器学习
  7. mysql 合计单条数据_mysql之数据去重并记录总数
  8. goldfish安装
  9. vim内部实现完美运行代码和脚本
  10. 集丰照明|LED 的产业链由哪些部分构成?
  11. 页面中的icon小图标,下载+设置
  12. 数据库中COMMENT关键字的使用
  13. GEE:Goometry几何图形的地理图形与平面图形
  14. macOs Ventura 13自动开机关机设置教程(命令行)
  15. 10个最新手机美食APP界面设计欣赏
  16. 深大校园网掉线/Drcom掉线/使校园网保持在线V2.0+Linux端Drcom登录方法(宿舍区教学区)
  17. 干货 | LoRaWAN 协议中文版,你要的pdf来了
  18. 支持webrtc的摄像头
  19. 云收呗api接口免费开放
  20. 支付宝运营10元花呗红包活动被薅羊毛了

热门文章

  1. python selenium --处理下拉框
  2. Java反射机制简单使用
  3. JS模式:jq中简单的模式--》采摘自js设计(tomxu_version)
  4. Haproxy+keepalived高可用代理服务
  5. Android技术经理+资深工程师+研发工程师-杭州
  6. lua 循环语句 实例
  7. golang 文件 文件夹 创建 读取 移动 复制 写入 遍历
  8. php 图片处理库 Imagick 代替 gd
  9. bitcoin cash的地址格式 cash addr 简介
  10. FD_READ FD_WRITE触发时机