Encapsulation is a good thing:
It partitions responsibility, hides implementation details, and promotes object reuse.
封装:按职责划分类,隐藏实现细节,提供对象重用。
IO Versus CPU Time
应用程序开发过程中,使用各种技巧将程序设计得更灵活,更优雅,更具扩展性是非常重要的。然而,很多人往往在其它方面花大力气,却忽视了另一个重要的方面:对IO操作没有给予足够的重视。
IO操作是否高效,将很大程度上影响系统的响应速度。
打个不是很恰当的比喻:
花100倍力气在程序(非IO)优化上,应用服务器吞吐量提高2倍
花10倍力气在IO程序优化上,应用服务器吞吐量提高100倍
应用IO非常耗时,稍微优化一点,性能就有上升很多。
所以,当发现程序完成一个功能,IO操作会占据很大一部分时间,那就需要去关注IO操作的优化了。否则,那些你精心设计的代码也只能空闲着(等待IO操作)。
No Longer CPU Bound
不要因为没有及时提供数据给CPU,而让CPU处于等待数据的状态,这是一种浪费。
比如:CPU希望一次处理一卡车的数据。
由于传统IO的低效:面向流Stream,一个字节/一行代码(传统IO类提供的数据大小为一铲子的量),极度不满足CPU的需求,最终导致CPU很多时候都是处于“等待数据”的状态,不能有效的利用CPU的处理能力。(注意:传统IO也可以通过封装数据到缓冲区Buffer,一次提供一车数据给CPU,只是决定权在程序员那里!)
NIO的出现,解决了数据量的问题,一次装一卡车(a Buffer Object )数据给CPU,让CPU尽情的处理。NIO倡导通过卡车(Buffer)运输数据给CPU。
Getting to the Good Stuff
NIO包提供了新的抽象体系解决低效IO的问题。
Channel、Buffer、Selector构成了NIO的核心,为高效IO提供了丰富的API进行数据操作。
虽然NIO不能访问任何操作系统的底层代码,但是NIO所提供的高性能IO操作,在大多数商业操作系统上都是可用的。
Buffer Handling
消除将数据从Kernel Space 到User Space的拷贝过程,提供效率
磁盘数据拷贝到JVM内存中需要经历几个步骤:
实现原理:
1. More than one virtual address can refer to the same physical memory location.
2. A virtual memory space can be larger thanthe actual hardware memory available.
By mapping a kernel space address to the same physicaladdress as a virtual address in user space, the DMA hardware (which can access only physical memory addresses) can fill a buffer that is simultaneously visible to both the kernel and a user space process.
由内核地址空间映射到同一个物理地址作为用户空间的虚拟地址
DMA硬件(只能访问物理内存地址)仍然将数据装入到内核空间
该缓冲区(内核空间在内存中的映射地址所指内存区域)同时对内核和用户空间是可见的。这样,将数据写入内核也就变相的写入到了用户空间了,JVM直接访问用户空间的虚拟地址就可以拿到内核缓存区的数据。
相关推荐
赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.0.Final.pom; 包含翻译后的API...
赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.0.Final.pom; 包含翻译后的API...
赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.4.Final.pom; 包含翻译后的API...
赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.4.Final.pom; 包含翻译后的API...
1. **HttpCore NIO概述** HttpCore NIO是HttpCore的一个子项目,专注于提供低级HTTP协议处理功能,特别强调性能和灵活性。它基于Java NIO API,利用其非阻塞I/O特性,可以同时处理大量连接,尤其适合于高并发的网络...
Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...
New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...
- `java.nio.channels.SelectionKey`:每个已注册的通道都会有一个对应的SelectionKey,它包含了通道与选择器之间的关系以及感兴趣的事件类型。 3. NIO工作流程 - 打开通道:例如创建一个FileChannel或...
1. java.nio.file.Files 类的介绍 2. Files.readAllBytes(Path) 方法的使用 3. SeekableByteChannel 和 InputStream 的使用 4. 文件读取的自动关闭机制 5. 字符编码的重要性 6. 大文件读取的注意事项
基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...
根据提供的文件信息,“Pro Java 7 NIO.2.pdf”由Anghel Leonard于2011年编写,主要介绍了Java 7中的新输入/输出(NIO)API,特别是NIO.2(JSR 203)所带来的增强功能。这本书通过一系列章节详细讲解了如何使用NIO.2...
1. **非阻塞模式**:Java.nio支持非阻塞I/O操作,这意味着线程不会因为等待I/O操作完成而被阻塞,从而提高了并发性能。 2. **缓冲区管理**:Java.nio使用缓冲区来存储数据,这比直接操作流更加高效,因为数据可以...
java运行依赖jar包
1. **通道(Channels)**: 通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO具有更好的性能和更高的灵活性。NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。...
Java I/O, NIO, 和 NIO.2 是Java平台中处理输入/输出操作的核心组件,对于任何Java开发者来说,理解和掌握这些概念至关重要。本文将深入探讨这些技术,旨在提供一个全面而详尽的概述。 Java I/O(Input/Output)是...