Java_NIO的不同之处与基本用法

本文介绍了Java的NIO(非阻塞I/O)系统,详细阐述了NIO与IO的区别,核心组件Channel和Buffer的使用,包括其主要方法。还探讨了allocate()与allocateDirect()的优缺点,并解释了NIO在非阻塞网络IO中的优势,通过单向“聊天室”实例展示了其工作原理。
摘要由CSDN通过智能技术生成

NIO

全称New IONon Blocking IO(非阻塞IO)

NIO与IO的区别

IO NIO
面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)
阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO)
选择器(Selectors)

Channel

通道,相当于火车的铁轨。



Buffer

缓冲区,NIO用于数据传输的载体。

不同的基本数据类型有对应的缓冲区(boolean除外)

最常用的还是ByteBuffer



主要方法:
  1. allocate() 初始化缓存区大小至JVM内存
  2. allocateDirect() 初始化缓存区大小至操作系统的物理内存
  3. capacity() 缓存区大小容量
  4. position() 读写操作的指针位置
  5. limit() 操作的边界值
  6. put() 将数据放入buffer中
  7. get() 获取buffer中的数据
  8. flip() 切换成读取模式
  9. rewind() 将position设为0
  10. clear() 将position设为0,limit设为capacity,之前写入的数据“被遗忘”
  11. compact() 将所有未读数据拷贝至Buffer数字的前面,limit同样设为capacity
  12. mark() 标记当前的position()位置
  13. reset() 将position恢复到mark()标记的位置

allocate()与allocateDirect()的优缺点

  1. 直接在操作系统内存上进行操作,大大避免了从直接OS的内存中复制数据到JVM的内存中,或从JVM内存中复制到OS内存中
  2. 直接内存的分配与取消分配通常都是高于非直接内存的,建议在易受操作系统IO操作影响的大型,持久的缓存区

网络IO

NIO非阻塞网络IO与传统网络IO的区别:
  1. 传统网络IO,是直接在Client与Server之间建立起IO连接,若Client端建立连接后,未及时发送数据,则Server端阻塞等待,若请求的并发增大,则阻塞的线程数增多,则Server端的CPU资源被占用;
  2. NIO,通过选择器(Selectors),监听Client与Cient建立起来的Channel,当Client的Channel准备就绪后(Buffer数据已经准备好即将发送),选择器再通过多线程,将IO请求发送至Server端,使得Server端多线程处理IO不会阻塞,更好地利用了Server端的CPU资源。
    NIOandIO


基于非阻塞IO的单向“聊天室”实例

package pro.eddie.demo;

import org.junit.Test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Date;
import java.util.Iterator;
import java.util
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值