引子:今天在面试的时候经过一位工程师的指点,在所做的服务器中使用了nio的特性,首先对于nio进行一下了解。
在 Java 编程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。流 I/O 用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换回对象。
NIO 与原来的 I/O 有同样的作用和目的,但是它使用不同的方式块 I/O。正如您将在本教程中学到的,块 I/O 的效率可以比流 I/O 高许多。
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 所具有的优雅性和简单性。
在 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 模型中,底层操作系统通道是双向的。
分享到:
相关推荐
在高吞吐、高并发的场景下,NIO架构的应用显得尤为重要。 NIO的核心组件包括以下几个部分: 1. **通道(Channel)**:通道类似于流,但具有双向性,可以从通道读取数据到缓冲区,也可以将缓冲区的数据写入通道。...
本实例将深入探讨Netty如何实现NIO在高并发场景下的优化和应用。 首先,让我们理解Java的NIO(Non-blocking I/O,非阻塞I/O)。传统的Java IO模型(BIO)是基于流(Stream)的,对每一个连接都需要一个线程来处理,当...
尤其是在处理高并发、大数据量的场景下,NIO的优势更为明显。 9. 注意事项: 虽然NIO提供了强大的性能优化,但它的API相对复杂,使用时需要注意内存管理,合理设置缓冲区大小,以及正确处理异常。 总之,NIO是...
在Java的IO编程中,NIO(Non-blocking Input/Output,非阻塞输入输出)是一种高效的数据处理方式,尤其适用于高并发场景。本示例主要关注如何使用NIO解决“沾包”问题以及处理因缓冲区满导致的写入失败问题。首先,...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步...对于Java开发者来说,掌握NIO技术不仅可以提高代码的并发处理能力,还能为处理复杂网络环境下的I/O问题提供有力工具。
在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,相较于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输方式,尤其适用于高并发、低延迟的场景。本Demo展示了如何在服务端...
在IT行业中,高并发处理架构是构建大规模、高性能系统的关键技术。它涉及到如何有效地处理大量同时到来的用户请求,确保系统的稳定性和响应速度。在这个场景下,`Redis`、`RabbitMQ`以及`Java`成为了核心组件,它们...
在Java编程领域,高并发处理是一项至关重要的技术,特别是在构建大型、高性能的互联网应用时。本文将基于"java 高并发解决思路"这一主题,深入探讨相关知识点,并结合"高并发web架构.pdf"文档中的实例进行阐述。 1....
高并发是指系统在同一时间处理大量请求的能力。在Java中,实现高并发通常涉及线程管理和并发控制。Java提供了线程池(如ExecutorService)来管理线程生命周期,减少创建和销毁线程的开销。此外,synchronized关键字...
- Netty 使用 NIO(非阻塞 I/O)模型,避免了线程等待 I/O 操作,提高了并发处理能力。 - 异步事件驱动通过 Future 和 ChannelPromise 实现,Future 代表操作结果,Promise 用于设置操作完成后的回调。 3. **高效...
在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于高并发、低延迟的系统。 **Java IO原理:** Java IO基于流模型,分为输入流和输出流。流是一维数据序列,可以是从源到目标的单向流动...
代码经过压力测试,采用反应器模式,没有第三方框架,实现功能:可以一个线程处理多个请求,也可以加上多线程。处理数据采用的多线程。实现功能:基于HTTP协议,解析请求和拼接响应,...测试并发,可以先下载,再浏览。
### 使用Java NIO编写高性能服务器的关键...综上所述,使用Java NIO编写的高性能服务器通过引入非阻塞IO机制,不仅极大地提升了系统的并发处理能力,还有效降低了资源消耗,是现代高性能服务器开发不可或缺的技术之一。
这些数据证明了Java NIO在高并发处理上的优越性。 总结来说,Java NIO通过其非阻塞特性、多路复用能力以及高效的Reactor模型,能够处理成千上万级别的并发连接,大大提升了服务器的性能。这使得它非常适合构建高...
在IT领域,构建高并发高性能服务器是至关重要的技术挑战,特别是在大数据时代,处理大量用户请求、实时数据交换以及保持高效的服务响应成为系统设计的核心。本资料包提供的"高并发高性能服务器"源码提供了深入理解这...
在Java NIO中,服务器端可以使用一个线程来处理多个客户端连接,这被称为“多路复用”或“选择器”模型,极大地减少了CPU资源的消耗,提高了系统的并发处理能力。 在传统的BIO模型中,每当一个新的客户端连接到来时...
为了应对高并发场景,Java在JDK 1.4版本中增加了NIO(New I/O,非阻塞IO)相关的API,这使得Java在处理高并发网络编程的能力有了质的提升。Java中的NIO技术允许用户在不阻塞线程的情况下进行IO操作,它使用了基于...
这样,NIO 可以更好地处理高并发连接,减少资源占用和提高性能。 5. 应用场景 在选择 IO 或 NIO 时,需要考虑具体的应用场景。如果需要管理数千个并发的连接,每一个连接只发送较少的数据(比如聊天服务器),使用...
3. **并发处理**: 高并发小型服务器需要处理大量的并发连接。在Java中,可以使用多线程技术来实现。每个连接的Socket通信通常在一个单独的线程中进行,以便服务器可以同时处理多个请求。此外,还可以使用线程池来...