Java NIO

NIO: 同步非阻塞,面向缓冲区,基于通道的io操作。

首先了解阻塞和非阻塞,同步和异步的概念

阻塞和非阻塞(基于进程):

阻塞:调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回

非阻塞:指在不能立刻得到结果之前,该调用不会阻塞当前线程。

同步和异步(基于应用程序):

同步:主动请求并等待I/O操作完毕

异步:主动请求数据后,便可以继续处理其它任务,随后等待I/O,操作完毕的通知

NIO三大核心部分:Buffer(缓冲区) 、Channel(通道) 、Selector(选择器)

它们之间的关系:

  

Buffer(缓冲区) : 一个可读写数据的内存块,可以理解成一个容器对象(含数组),该对象提供了一组方法,可以更轻松使用内存块

常用Buffer子类一览

ByteBuffer,存储字节数据到缓冲区

ShortBuffer,存储字符串数据到缓冲区

CharBuffer,存储字符数据到缓冲区

IntBuffer,存储整数数据到缓冲区

LongBuffer,存储长整型数据到缓冲区

DoubleBuffer存储小数到缓冲区 FloatBuffer,存储小数到缓冲区

Buffer类定义了所有的缓冲区都具有的四个属性来提供关于其所包含的数据元素的信息

Capacity:容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变

Limit:表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的

Position:位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写作准备

Mark:标记

 

Channel(通道): NIO的通道类型于流,但通道可以同时读写,流只能读或者只能写

Selector(选择器): 检测多个注册的通道上是否有事件发生

NIO与BIO对比:

面向缓冲与面向流

IO是面向流的.NIO是面向缓冲区的。Java IO面向流意味着毎次从流中读一个成多个字节,直至读取所有字节,它们没有被缓存在任何地方,此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的教据,需要先将它缓存到一个缓冲区。Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,霱要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数裾。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据

NIO:一个线程管理多个连接
BIO:一个线程管理一个连接

 

03-15
### Java NIO 教程与文档 Java NIO 是一种基于缓冲区和通道的 I/O 处理方式,相较于传统的 Java IO 更高效且适合处理大规模数据传输。以下是关于 Java NIO 的一些核心概念及其学习资源。 #### 1. **核心组件** Java NIO 主要由以下几个部分组成: - **Buffer**: 数据容器,用于存储不同类型的原始数据[^4]。 - **Channel**: 类似于流的概念,但支持双向读写操作。 - **Selector**: 支持多路复用机制,允许单线程管理多个 Channel。 这些组件共同构成了高效的非阻塞 I/O 模型,适用于网络编程和文件操作场景。 #### 2. **官方文档** Oracle 官方文档提供了详尽的 Java NIONIO.2 API 描述以及使用示例。可以通过访问 Oracle 官网并搜索 "Java SE documentation" 来获取最新的官方文档[^3]。 #### 3. **教程推荐** Baeldung 网站上的教程涵盖了 Java NIO 的基本原理及高级应用案例。例如,“Five ways to maximize Java NIO and NIO.2” 提供了五个重要的功能介绍,包括变更通知器(Change Notifiers),这使得监听事件变得更加简单。 #### 4. **实际应用场景** 通过结合实例代码可以更好地理解如何利用 Java NIO 实现高性能的数据传输。例如,在文件写入方面有多种实现方法,既可以直接采用标准库中的 `Files` 工具类,也可以借助更底层的 Buffer 和 Channel 结构完成复杂任务[^1]。 ```java import java.nio.file.*; import java.io.IOException; public class FileWriteExample { public static void main(String[] args) throws IOException { Path path = Paths.get("example.txt"); String content = "This is a test."; // 使用 Files.write 方法快速写入字符串到文件 Files.write(path, content.getBytes()); } } ``` 上述代码展示了如何利用 `Files.write()` 函数向指定路径下的文件写入一段文本内容。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值