待续。。。

该文章部分摘自: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. VUE- 引用视频组件

    VUE- 引用视频组件 安装依赖 cnpm install vue-video-player -S cnpm install video.js -S 全局引用: 在main.js中 import Vu ...

  2. B. Odd Sum Segments CF(分割数组)

    题目地址 http://codeforces.com/contest/1196/problem/B B. Odd Sum Segments time limit per test 3 seconds ...

  3. 数字证书原理(ssl,https)

    https://blog.csdn.net/qq_34115899/article/details/81298284 关于私钥公钥数字签名数字证书.https.RSA的一些讲解 http://www. ...

  4. javaweb06 文件的下载

    1. 如何修改小工具或框架的源代码 ? 1). 原则: 能不修改就不修改. 2). 修改的方法: > 修改源代码, 替换 jar 包中对应的 class 文件. > 在本地新建相同的包, ...

  5. Baes.css

    这个公共样式还不错 html,body,ul,li,ol,img,a,p,div,form,input,h1,h2,h3,h4.h5,h6{ margin: 0; padding: 0; /*盒模型* ...

  6. UML-如何画操作契约?

    1.在编写契约过程中,发现之前的领域模型不对,此时是否需要修改? 需要修改.包括:概念类.属性.关联.这就是不断迭代和进化 2.用例中复杂场景里的状态变化细节,描述过多导致用例臃肿,让人看不下去,因此 ...

  7. LGOJ1344 追查坏牛奶

    Description link 题意概述:给一张图,每条边有边权,求让点 \(1\) 和点 \(n\) 不连通的"最小破坏边权和" 和 "在此基础上的最小破坏边数&qu ...

  8. java8新特性-函数式接口详细讲解及案例

    一.函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口.函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适 ...

  9. ae基础一

    1.导入素材2.整理素材3.创建合成1280*720是高清的模式 也是平时都用的格式 HDV/HDTV 720 251920*1080是超清的模式格式是以16:9的格式显示的 电脑电视机都是用这个比例 ...

  10. 886A. ACM ICPC#均值分配问题(暴力)

    题目出处:http://codeforces.com/problemset/problem/886/A 题目大意:已知六个人得分,问是否能分成两个三人队使得每个队伍得分加和相等 #include< ...