`
sharp-fcc
  • 浏览: 110881 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nio 高并发处理

阅读更多

引子:今天在面试的时候经过一位工程师的指点,在所做的服务器中使用了nio的特性,首先对于nio进行一下了解。

 

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服务的架构(NIO架构及应用之一)

    在高吞吐、高并发的场景下,NIO架构的应用显得尤为重要。 NIO的核心组件包括以下几个部分: 1. **通道(Channel)**:通道类似于流,但具有双向性,可以从通道读取数据到缓冲区,也可以将缓冲区的数据写入通道。...

    Java高并发编程代码(Netty NIO 实例)

    本实例将深入探讨Netty如何实现NIO在高并发场景下的优化和应用。 首先,让我们理解Java的NIO(Non-blocking I/O,非阻塞I/O)。传统的Java IO模型(BIO)是基于流(Stream)的,对每一个连接都需要一个线程来处理,当...

    NIO处理大文件

    尤其是在处理高并发、大数据量的场景下,NIO的优势更为明显。 9. 注意事项: 虽然NIO提供了强大的性能优化,但它的API相对复杂,使用时需要注意内存管理,合理设置缓冲区大小,以及正确处理异常。 总之,NIO是...

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

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

    java nio 多种模式 源码 支持高并发

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步...对于Java开发者来说,掌握NIO技术不仅可以提高代码的并发处理能力,还能为处理复杂网络环境下的I/O问题提供有力工具。

    服务端以NIO的方式处理请求的Demo

    在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,相较于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输方式,尤其适用于高并发、低延迟的场景。本Demo展示了如何在服务端...

    高并发处理架构。。。。

    在IT行业中,高并发处理架构是构建大规模、高性能系统的关键技术。它涉及到如何有效地处理大量同时到来的用户请求,确保系统的稳定性和响应速度。在这个场景下,`Redis`、`RabbitMQ`以及`Java`成为了核心组件,它们...

    java 高并发解决 思路

    在Java编程领域,高并发处理是一项至关重要的技术,特别是在构建大型、高性能的互联网应用时。本文将基于"java 高并发解决思路"这一主题,深入探讨相关知识点,并结合"高并发web架构.pdf"文档中的实例进行阐述。 1....

    java面试题_高并发、高可用、分布式(9题)

    高并发是指系统在同一时间处理大量请求的能力。在Java中,实现高并发通常涉及线程管理和并发控制。Java提供了线程池(如ExecutorService)来管理线程生命周期,减少创建和销毁线程的开销。此外,synchronized关键字...

    Netty 高并发深入浅出学习高并发服务器

    - Netty 使用 NIO(非阻塞 I/O)模型,避免了线程等待 I/O 操作,提高了并发处理能力。 - 异步事件驱动通过 Future 和 ChannelPromise 实现,Future 代表操作结果,Promise 用于设置操作完成后的回调。 3. **高效...

    java NIO技巧及原理

    在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于高并发、低延迟的系统。 **Java IO原理:** Java IO基于流模型,分为输入流和输出流。流是一维数据序列,可以是从源到目标的单向流动...

    基于HTTP、NIO、多线程实现浏览器高并发非阻塞访问服务器文件

    代码经过压力测试,采用反应器模式,没有第三方框架,实现功能:可以一个线程处理多个请求,也可以加上多线程。处理数据采用的多线程。实现功能:基于HTTP协议,解析请求和拼接响应,...测试并发,可以先下载,再浏览。

    使用Java_NIO编写高性能的服务器.doc

    ### 使用Java NIO编写高性能服务器的关键...综上所述,使用Java NIO编写的高性能服务器通过引入非阻塞IO机制,不仅极大地提升了系统的并发处理能力,还有效降低了资源消耗,是现代高性能服务器开发不可或缺的技术之一。

    Java NIO与IO性能对比分析.pdf

    这些数据证明了Java NIO在高并发处理上的优越性。 总结来说,Java NIO通过其非阻塞特性、多路复用能力以及高效的Reactor模型,能够处理成千上万级别的并发连接,大大提升了服务器的性能。这使得它非常适合构建高...

    高并发高性能服务器

    在IT领域,构建高并发高性能服务器是至关重要的技术挑战,特别是在大数据时代,处理大量用户请求、实时数据交换以及保持高效的服务响应成为系统设计的核心。本资料包提供的"高并发高性能服务器"源码提供了深入理解这...

    java NIO socket聊天

    在Java NIO中,服务器端可以使用一个线程来处理多个客户端连接,这被称为“多路复用”或“选择器”模型,极大地减少了CPU资源的消耗,提高了系统的并发处理能力。 在传统的BIO模型中,每当一个新的客户端连接到来时...

    Java在高并发网络编程中的应用

    为了应对高并发场景,Java在JDK 1.4版本中增加了NIO(New I/O,非阻塞IO)相关的API,这使得Java在处理高并发网络编程的能力有了质的提升。Java中的NIO技术允许用户在不阻塞线程的情况下进行IO操作,它使用了基于...

    IO和NIO区别

    这样,NIO 可以更好地处理高并发连接,减少资源占用和提高性能。 5. 应用场景 在选择 IO 或 NIO 时,需要考虑具体的应用场景。如果需要管理数千个并发的连接,每一个连接只发送较少的数据(比如聊天服务器),使用...

    Java_Socket开发高并发小型服务器

    3. **并发处理**: 高并发小型服务器需要处理大量的并发连接。在Java中,可以使用多线程技术来实现。每个连接的Socket通信通常在一个单独的线程中进行,以便服务器可以同时处理多个请求。此外,还可以使用线程池来...

Global site tag (gtag.js) - Google Analytics