Funny things of nio

2022-05-06 12:44:20 浏览数 (1)

Funny things of nio

  • FileChannel常用API详解,包括FileChannel.open方法获取通道
  • ByteBuffer缓冲区的三种创建方式与解读---重点区分直接和非直接缓冲区
  • Java IO流之DataInputStream和DataOutputStream分析
  • 扫描流(Scanner)
  • Runtime.getRuntime().exec踩坑总结(/bin/sh -c、异常流重定向)
  • OP_READ和OP_WRITE事件的触发条件
  • Java NIO开发需要注意的坑
  • 读Socket流时产生阻塞的解决方案(粘包拆包问题)
  • (Java)socket网络编程及处理socket粘包拆包问题
  • Selector.open,register和select方法的源码剖析
  • wakeup底层实现
  • java nio及操作系统底层原理
  • HTTP,状态码,TCP、UDP等网络协议
  • SocketChannel---各种注意点

FileChannel常用API详解,包括FileChannel.open方法获取通道

FileChannel.open()的方式

代码语言:javascript复制
FileChannel channell = FileChannel.open(Paths.get("a.txt","c.txt"), StandardOpenOption.CREATE,StandardOpenOption.WRITE);
FileChannel channel2 = FileChannel.open(new File("a.txt").toPath(), StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE,StandardOpenOption.READ);

path获取

  • Paths.get()
  • new File(“a.txt”).toPath()

OpenOption接口的实现类通常由StandardOpenOption枚举进行代替。

代码语言:javascript复制
public enum StandardOpenOption implements OpenOption {
    READ,
    WRITE,
    APPEND,//累加
    TRUNCATE_EXISTING,//如果该文件已存在并且为写入访问而打开,则其长度将被截断为0。如果只为读取访问打开文件,则忽略此选项。
    CREATE,//不能单独使用,要与WRITE配套使用,单独使用会报错java.nio.file.NoSuchFileException,如果文件已存在,重复创建不会报错
    CREATE_NEW,//不能单独使用,要与WRITE配套使用,如果文件已存在,则出现异常java.nio.file.FileAlreadyExistsException
    DELETE_ON_CLOSE,
    SPARSE,//稀疏文件,空闲位置不占内存(不要使用CREATE来创建稀疏文件)
    SYNC,//要求对文件内容或元数据的每次更新都同步写入底层存储设备。如果这样做,程序运行的效率就降低了。
    DSYNC;//要求对文件内容的每次更新都同步写入底层存储设备。 
          //枚举常量SYNC与DSYNC的区别:SYNC更新内容与元数据,而DSYNC只更新内容,与force(boolean)方法作用一样。
}

FileChannel(API详解)

ByteBuffer缓冲区的三种创建方式与解读—重点区分直接和非直接缓冲区

直接缓冲区和非直接缓冲区的比较:

直接缓冲区:

  • 直接缓冲区在内部使用sun.misc.Unsafe类进行值的处理。Unsafe类的作用是JVM与操作系统进行直接通信。
  • 直接缓冲区操作的数据不在JVM堆中,而是在内核空间中,这样提高运行效率。
  • 通过allacateDirect()返回的缓冲区进行内存的分配和释放所需的时间成本通常要高于非直接缓冲区,但运行效率远比非直接高。

非直接缓冲区:

  • 在内部直接对数组进行操作,并且是在JVM的堆中进行数组处理。
  • 直接缓冲区提高运行效率的原理是每次调用基于操作系统的I/O操作之前或之后,JVM都会尽量避免将缓冲区的内容复制到中间缓冲区,或者从中间缓冲区中获取内容,这样就节省了一个步骤。

ByteBuffer缓冲区的三种创建方式与解读

Java IO流之DataInputStream和DataOutputStream分析

Java IO流之DataInputStream和DataOutputStream分析

扫描流(Scanner)

扫描流(Scanner)

Runtime.getRuntime().exec踩坑总结(/bin/sh -c、异常流重定向)

Runtime.getRuntime().exec踩坑总结(/bin/sh -c、异常流重定向)

OP_READ和OP_WRITE事件的触发条件

OP_READ

  • 有数据可以读取
  • 远程另一端关闭
  • 有一个错误的pending

断开连接后,为了让你知道连接已断开,所以会产生OP_READ事件。

那么该怎么判断呢?

其实只要判断一下byteBuffer的大小就可以了,当byteBuffer的长度小于0时,说明连接断开了,那么把channel关闭就可以了。如下:

代码语言:javascript复制
            long readLength = sc.read(buf);
            if(readLength < 0) sc.close();

OP_WRITE

OP_WRITE处理不当很容易导致CPU 100%

OP_WRITE触发条件:

前提:interest了OP_WRITE

触发条件:

  • socket发送缓冲区可写
  • 远端关闭
  • 有错误发生

正确的处理方式:

  • 仅在已经连接的channel上注册
  • 仅在有数据可写的时候才注册
  • 触发之后立即取消注册,否则会继续触发导致循环
  • 处理完成后视情况决定是否继续注册
  • 没有完全写入,继续注册
  • 全部写入,无需注册

Java NIO开发需要注意的坑

Java NIO开发需要注意的坑 https://www.cnblogs.com/qhyuan1992/p/5385289.html

读Socket流时产生阻塞的解决方案(粘包拆包问题)

读Socket流时产生阻塞的解决方案(粘包拆包问题)

(Java)socket网络编程及处理socket粘包拆包问题

(Java)socket网络编程及处理socket粘包拆包问题

Selector.open,register和select方法的源码剖析

《Java源码解析》之NIO的Selector机制(Part2:SelectableChannel.register(Selector sel, int ops))

《Java 源码分析》:Java NIO 之 Selector(第二部分selector.select())

wakeup底层实现

NIO的selector.wakeup的实现

Java NIO类库Selector机制解析(上)

Java NIO类库Selector机制解析(下)

java nio及操作系统底层原理

NIO 水平触发,边缘触发的区别

java nio及操作系统底层原理

关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结

HTTP,状态码,TCP、UDP等网络协议

图解HTTP,状态码,TCP、UDP等网络协议相关总结(持续更新)

SocketChannel—各种注意点

SocketChannel—各种注意点

0 人点赞