待续。。。

该文章部分摘自:http://tutorials.jenkov.com/java-nio/index.html

一、I/O简介

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

IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。
Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。

二、NIO

1、概念:

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础。

2、NIO与I/O区别

NIO 与原来的 I/O 有同样的作用和目的,但是它使用不同的方式? 块 I/O。

原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。

3、NIO概述

NIO:通道和缓冲区

在标准IO API中,使用字节流和字符流。 而在NIO中,使用的是通道和缓冲区。 数据总是从通道读入缓冲区,或从缓冲区写入通道。

NIO: 非阻塞IO

线程可以要求通道将数据读入缓冲区。 当通道将数据读入缓冲区时,线程可以执行其他操作。 一旦数据被读入缓冲区,线程就可以继续处理它。 将数据写入通道也是如此。

Java NIO: Selectors

选择器是一个可以监视多个事件通道的对象(例如:连接打开,数据到达等)。 因此,单个线程可以监视多个通道的数据。

4、Java NIO Channel

通道类似于流,但是有一些差异:

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

2) 可以异步读取和写入通道。

3) 通道将数据读入缓冲区,缓冲区将数据写入通道

Channel Implementations

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel从文件读取数据和读取数据到文件。

DatagramChannel可以通过UDP在网络上读写数据。

SocketChannel可以通过TCP在网络上读写数据。

ServerSocketChannel允许您监听传入的TCP连接,就像Web服务器一样。 对于每个传入连接,都会创建一个SocketChannel。

4、Java NIO Buffer

在与NIO通道交互时使用Java NIO缓冲区。 如您所知,数据从通道读入缓冲区,并从缓冲区写入通道。

缓冲区本质上是一个可以写入数据然后可以再次读取的内存块。 此内存块包含在NIO Buffer对象中,该对象提供了一组方法,可以轻松地使用内存块。

5、Java NIO Selector

Java NIO Selector是一个可以检查一个或多个Java NIO Channel实例的组件,能确定哪些通道可以用于例如 阅读或写作。 这样,单个线程可以管理多个通道,从而管理多个网络连接。

 

Java NIO:一个Thread使用一个Selector来处理3个Channel

使用步骤:

1)创建一个Selector:

Selector selector = Selector.open();

2)要使用带选择器的通道,必须使用选择器注册通道。

channel.configureBlocking(false);

SelectionKey key = channel.register(selector, SelectionKey.OP_READ);

通道必须处于非阻塞模式才能与选择器一起使用。 这意味着您无法将FileChannel与Selector一起使用,因为FileChannel是无法切换到非阻塞模式的。而Socket channels是可以正常工作。

注意register()方法的第二个参数。 这是一个“兴趣集”,意味着您有兴趣在频道中通过选择器收听哪些事件。 您可以收听四种不同的活动:

  1. Connect
  2. Accept
  3. Read
  4. Write

这四个事件由四个SelectionKey常量表示:

  1. SelectionKey.OP_CONNECT
  2. SelectionKey.OP_ACCEPT
  3. SelectionKey.OP_READ
  4. SelectionKey.OP_WRITE

如果您对多个事件感兴趣,或者将常量放在一起,如下所示:

int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

SelectionKey

Java NIO SocketChannel

打开一个SocketChannel:

SocketChannel socketChannel = SocketChannel.open();

socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

NIO与IO的更多相关文章

  1. Java中 NIO与IO的区别

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  2. java nio 与io区别

    转自:http://blog.csdn.net/keda8997110/article/details/19549493 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使 ...

  3. Java NIO与IO的区别和比较

    传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大.使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数 ...

  4. Java基础知识强化之IO流笔记83:NIO与IO

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  5. Java NIO和IO的主要区别

    From :http://blog.csdn.net/keda8997110/article/details/19549493 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部 ...

  6. Java中的NIO和IO的对比分析

    总的来说,java中的IO和NIO主要有三点区别: IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器(Selectors) 1.面向流与面向缓冲 Java NIO和IO之间第一个最大的 ...

  7. Java NIO 和 IO 的区别详解

    Java NIO为jdk1.4提供了新的API,本文主要来比较一下Java中NIO和IO的区别,Java初学者可以了解一下. 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分 ...

  8. Java NIO与IO

    当学习了Java NIO和IO的API后,一个问题立即涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们怎样影响您的代 ...

  9. NIO和IO(转)

    java NIO由以下几个核心部分组成: Channels(通道) Buffers(缓冲区) Selectors(选择器) 其他 Channel和Buffer: 所有的IO再NIO中都从一个Chann ...

  10. Java NIO 与 IO

    我应该何时使用 IO,何时使用 NIO 呢?在本文中,我会尽量清晰地解析 Java NIO 和 IO 的差异.它们的使用场景,以及它们如何影响您的代码设计. Java NIO 和 IO 的主要区别 下 ...

随机推荐

  1. 题解 P1019 【单词接龙】

    题目 单词具体是什么不重要,知道单词间如何转化即可 [分析] 先理清一下题意: \(n\)个单词,每个单词限用两次 上一个单词能与下一个单词接上,当且仅当上一个单词的末尾 \(k\) 个字符与下一个单 ...

  2. linux-文件系统和目录

    linux目录说明 /:系统根目录 /usr:用户的程序 /home:默认创建用户在此目录下创建用户主目录 /etc:存放系统配置文件.服务脚本,一些程序配置文件 /bin:常用命令 /sbin:常用 ...

  3. Fiddler 断点命令

    Request 断点:bpu /priceCalculate 清除命令:bpu Response 断点:bpafter /priceCalculate 清除命令:bpafter

  4. 基于springboot实现Ueditor并生成.html的示例

    一.项目架构 二.项目代码 1.HtmlProductController.java package com.controller; import java.io.File; import java. ...

  5. squid完全攻略

    squid完全攻略 http://blog.sina.com.cn/s/blog_7572cf8e0100rl99.html squid,nginx,lighttpd反向代理的区别 [root@loc ...

  6. 网页时不时打不开?试试阿里DNS 233.5.5.5 /233.6..6.6

    最经上网都是用手机热点,但发现用谷歌浏览器时,时不时打不开网页.最后发现是DNS的问题,原来我的dns是8.8.8.8. 最后更改成阿里的DNS 233.5.5.5 /233.6..6.6,打开网页流 ...

  7. js实现placehoider效果

    placeholder作为input输入框提示语很好用,但是低版本ie却不支持,对于只有提示语的输入框并不适用 <input type="text" value=" ...

  8. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第二天】

    淘淘商城(SpringMVC+Spring+Mybatis)  是传智播客在2015年9月份录制的,几年过去了.由于视频里课上老师敲的代码和项目笔记有些细节上存在出入,只有根据日志报错信息作出适当的调 ...

  9. PAT Advanced 1059 Prime Factors (25) [素数表的建⽴]

    题目 Given any positive integer N, you are supposed to find all of its prime factors, and write them i ...

  10. node/静态路由/express框架中的express.static()和app.use()

    此篇文章转载于 express框架中的express.static()和app.use() Express框架在使用app.use中传入express.static设置静态路由时,这个文件夹下的所有文 ...