`

NIO学习(一)

NIO 
阅读更多
[size=medium]NIO学习

一.NIO中的几个基础概念

在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。
  首先从Channel说起吧,通道,顾名思义,就是通向什么的道路,为某个提供了渠道。在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:
public class Test {
    public static void main(String[] args) throws IOException  {
        File file = new File("data.txt");
        InputStream inputStream = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        inputStream.read(bytes);
        inputStream.close();
    } 
}
  这里的InputStream实际上就是为读取文件提供一个通道的。
  因此可以将NIO 中的Channel同传统IO中的Stream来类比,但是要注意,传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。而Channel是双向的,既可用来进行读操作,又可用来进行写操作。
  Buffer(缓冲区),是NIO中非常重要的一个东西,在NIO中所有数据的读和写都离不开Buffer。比如上面的一段代码中,读取的数据时放在byte数组当中,而在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。
下面介绍一下NIO中最核心的一个东西:Selector。可以说它是NIO中最关键的一个部分,Selector的作用就是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。
比如看下面的这个例子:



用单线程处理一个Selector,然后通过Selector.select()方法来获取到达事件,在获取了到达事件之后,就可以逐个地对这些事件进行响应处理。


二.Channel

在前面已经提到,Channel和传统IO中的Stream很相似。虽然很相似,但是有很大的区别,主要区别为:通道是双向的,通过一个Channel既可以进行读,也可以进行写;而Stream只能进行单向操作,通过一个Stream只能进行读或者写;
  以下是常用的几种通道:
FileChannel
SocketChanel
ServerSocketChannel
DatagramChannel
  通过使用FileChannel可以从文件读或者向文件写入数据;通过SocketChannel,以TCP来向网络连接的两端读写数据;通过ServerSocketChanel能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的SocketChannel来进行数据读写;通过DatagramChannel,以UDP协议来向网络连接的两端读写数据。
  下面给出通过FileChannel来向文件中写入数据的一个例子:

public class Test {
    public static void main(String[] args) throws IOException  {
        File file = new File("data.txt");
        FileOutputStream outputStream = new FileOutputStream(file);
        FileChannel channel = outputStream.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        String string = "java nio";
        buffer.put(string.getBytes());
        buffer.flip();     //此处必须要调用buffer的flip方法
        channel.write(buffer);
        channel.close();
        outputStream.close();
    } 
}
  通过上面的程序会向工程目录下的data.txt文件写入字符串"java nio",注意在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容,至于具体原因将在下篇博文中具体讲述Buffer的用法时阐述。


三.Buffer

Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。具体看下面这张图就理解了:



  上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。
  在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:
ByteBuffer
IntBuffer
CharBuffer
LongBuffer
DoubleBuffer
FloatBuffer
ShortBuffer
  如果是对于文件读写,上面几种Buffer都可能会用到。但是对于网络读写来说,用的最多的是ByteBuffer。
  关于Buffer的具体使用以及它的limit、posiion和capacity这几个属性的理解在下一篇文章中讲述。


四.Selector


Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。
  与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。[/size]
分享到:
评论

相关推荐

    JAVA NIO 学习资料

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从JDK 1.4版本开始引入的一种新的IO模型,它为Java应用程序提供了...虽然NIO的学习曲线相对较陡,但掌握后,能为复杂IO场景提供强大的解决方案。

    JAVA NIO学习网站

    在《JAVA NIO学习网站》的博文中,作者可能详细讲解了如何使用这些组件以及它们之间的交互。例如,可能会介绍如何创建并配置通道,如何使用缓冲区读写数据,如何注册通道到选择器,以及如何利用选择器处理多个并发...

    nio demo for nio学习笔记(体系结构以及模块介绍)

    **NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与传统I/O不同的数据处理方式。在传统的IO模型中,数据的读写是阻塞式的,即在读取或写入数据时,程序会暂停执行,等待数据...

    Java NIO学习资料+代码.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java在JDK 1.4版本引入的一种新的I/O模型,它为Java开发者提供了更高效、...学习和掌握Java NIO,能够帮助开发者编写出更高效、更易维护的网络程序。

    nio学习文档及代码

    本资料包包含了"nio学习文档及示例代码",旨在帮助开发者快速理解和应用NIO。 **1. NIO基础** NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据传输的路径,如文件通道、...

    NIO学习总结经典

    《NIO学习总结经典》这篇文章主要探讨了Java的New IO(NIO)框架,这是一个用于高效处理I/O操作的重要库,特别是在处理大量并发连接时。NIO与传统的IO(-blocking I/O)相比,提供了非阻塞的I/O模型,极大地提高了...

    NIO学习总结

    《NIO学习总结》 NIO(Non-blocking I/O,非阻塞I/O)是Java在JDK 1.4引入的一种新的I/O模型,它为Java提供了更高效的数据处理方式,尤其适用于高并发、大数据量的网络应用。相较于传统的BIO(Blocking I/O)模型,...

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    NIO(Non-Blocking I/O)是一种异步非阻塞式 I/O 模式,服务器使用单个线程来处理多个客户端请求,提高了服务器的性能和可扩展性。 AIO(Asynchronous I/O)是一种异步非阻塞式 I/O 模式,服务器使用回调函数来处理...

    java NIO 学习 聊天室程序 (3)

    在这个“Java NIO 学习 聊天室程序”项目中,我们将深入探讨NIO如何用于创建一个聊天室程序。这个程序可能包含以下几个关键部分: 1. **服务器端**:服务器端使用NIO的ServerSocketChannel监听客户端连接。当新的...

    apache nio 很好的学习资料

    Apache NIO,全称为Non-blocking Input/Output,是Java提供的一种高效、灵活的I/O模型,与传统的BIO( Blocking I/O)模型相比,它在处理高并发、大数据量的网络应用时具有显著优势。本学习资料将深入探讨Apache NIO...

    NIO学习与总结

    ### NIO学习与总结 #### 一、NIO概述与核心概念 **NIO(New IO)**,即新输入/输出技术,是Java 1.4版本开始引入的一种新的I/O处理方式,旨在提高Java应用程序的I/O处理效率。与传统的基于流的I/O相比,NIO更加...

    NIO学习资料大全

    NIO(Non-blocking Input/Output,非阻塞输入/输出)是Java提供的一个高效I/O模型,相较于传统的IO模型(Blocking I/O),NIO在处理大量并发连接时表现出更高的性能和灵活性。NIO的核心概念包括通道(Channels)、...

    JAVA_NIO学习总结

    ### JAVA_NIO学习总结 #### 重要知识点概览 JAVA_NIO(Non-blocking I/O,非阻塞I/O)是Java平台中用于替代传统IO(Blocking IO)的一种高性能IO处理模型,首次出现在JDK 1.4中。NIO通过引入通道(Channel)和缓冲区...

    Java NIO系列教程(一) Java NIO 概述

    ### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...

    NIO学习系列:连网和异步IO

    在IT行业中,网络编程是构建分布式系统和网络应用的基础,而Java NIO(Non-blocking Input/Output)则是Java提供的一种高效、低延迟的I/O模型。本篇文章将深入探讨NIO在连网和异步IO方面的应用,以及如何通过源码...

    nio学习demo 处理因缓冲区满导致写入失败问题

    在Java的IO编程中,NIO(Non-blocking Input/Output,非阻塞输入输出)是一种高效的数据处理方式,尤其适用于高并发场景。本示例主要关注如何使用NIO解决“沾包”问题以及处理因缓冲区满导致的写入失败问题。首先,...

Global site tag (gtag.js) - Google Analytics