本文共 1467 字,大约阅读时间需要 4 分钟。
Java NIO详解
作为一名前端开发者,我最近由于参与开发一个管理系统而陷入了一个长达20天的代码断更困境。面对即将到来的春招,我利用碎片化时间学习了NIO(非阻塞输入输出),并将学习笔记整理如下,希望能为同样经历过IO与NIO开发过程的开发者提供帮助。
一、NIO简介
NIO(Java NIO)与传统的IO有着相同的功能和目的,但在实现方式上有着显著的不同。NIO支持面向缓冲区的、基于通道的IO操作,这使得它在处理数据输入输出时比传统IO更高效。
二、NIO与传统IO的主要区别
1.传统IO特点
- 面向流:传统IO是基于流的概念,一个InputStream对应一个OutputStream,数据流动是单向的。
- 阻塞IO:传统IO是基于阻塞模型,即等待IO操作完成才会继续执行后续操作。
2.NIO特点
- 面向缓冲区:NIO操作是基于缓冲区的,数据以固定块的形式处理。
- 非阻塞IO:NIO支持非阻塞IO(Non Blocking IO),允许多个IO操作同时进行。
- 选择器(Selectors):通过选择器(Selectors)可以同时监控多个通道的状态,提升IO操作的效率。
三、NIO的核心:通道与缓冲区
1.通道(Channel)
- 作用:连接IO设备(如文件或网络套接字)。
- 特点:通道本身不存储数据,需要配合缓冲区进行数据传输。
2.缓冲区(Buffer)
- 作用:用于存取和处理数据,缓冲区是基于内存的数组,支持多种数据类型(如ByteBuffer、CharBuffer等)。
- 操作:
- allocate():分配缓冲区。
- put():将数据写入缓冲区。
- get():从缓冲区读取数据。
- flip():切换读写模式。
- rewind():重置缓冲区位置。
- clear():清空缓冲区。
- hasRemaining():判断缓冲区是否还有剩余数据。
四、直接缓冲区与非直接缓冲区
- 非直接缓冲区:通过
allocate()方法分配,缓冲区建立在JVM内存中。 - 直接缓冲区:通过
allocateDirect()方法分配,缓冲区直接映射到物理内存,提升数据读写效率。
五、通道的原理与获取
1.通道类型
- FileChannel:用于文件操作。
- SocketChannel、ServerSocketChannel:用于网络通信。
- DatagramChannel:用于UDP数据包通信。
2.获取通道
- 对于支持通道的类(如FileInputStream、RandomAccessFile等),可以通过
getChannel()方法获取通道。 - 网络IO:通过Socket、ServerSocket、DatagramSocket获取SocketChannel或DatagramChannel。
六、通道之间的数据传输
- transferFrom()与transferTo():用于数据的传输。
- 示例:
FileChannel inChannel = FileChannel.open(Paths.get("d:/1.txt"), OpenOption.READ);FileChannel outChannel = FileChannel.open(Paths.get("d:/2.txt"), OpenOption.WRITE);inChannel.transferTo(0, inChannel.size(), outChannel);
通过以上内容的学习,我希望能够帮助更多开发者快速掌握NIO的核心概念。如果有任何疑问或错误,欢迎在评论区指出!
转载地址:http://mdjfk.baihongyu.com/