待续。。。

该文章部分摘自: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. 吴裕雄--天生自然 JAVASCRIPT开发学习:HTML DOM 元素 (节点)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. PAT 2011 秋

    A : World Cup Betting #include <cstdio> #include <iostream> #include <algorithm> u ...

  3. ADS1.2 调试问题

    最近一个程序需要用到ADS1.2这个软件,在使用过程中出现了如下问题: 1.由于以前用的是KEIL,所以没找到文件的工程,查资料才发现,这个工程文件打开的文件是MCP格式的文件: 2.调试的时候,没找 ...

  4. FileReader笔记

    FileReader API链接地址:https://developer.mozilla.org/en-US/docs/Web/API/FileReader 实例代码: <!DOCTYPE ht ...

  5. int preg_match( string pattern

    preg_match -- 进行正则表达式匹配.并且只匹配一次,注意与preg_match_all区别. int preg_match( string pattern, string subject ...

  6. [LC] 51. N-Queens

    Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a d ...

  7. Java机器学习软件介绍

    Java机器学习软件介绍 编写程序是最好的学习机器学习的方法.你可以从头开始编写算法,但是如果你要取得更多的进展,建议你采用现有的开源库.在这篇文章中你会发现有关Java中机器学习的主要平台和开放源码 ...

  8. 吴裕雄--天生自然 PHP开发学习:多维数组

    <pre> <?php // 二维数组: $cars = array ( array("Volvo",100,96), array("BMW" ...

  9. 漫谈设计模式(一):代理(Proxy)模式与适配器(Adapter)模式对比

    1.前言 为什么要将代理模式与适配器模式放在一起来说呢?因为它们有许多的共同点,当然也有一些不同的地方.首先两者都是属于结构型模式.结构型模型是这样定义的: 结构型模式涉及到如何组合类和类以获得更大的 ...

  10. python学习笔记(31)——日志格式