Funny things of nio

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Funny things of nio相关的知识,希望对你有一定的参考价值。


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

FileChannel.open()的方式

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枚举进行代替。

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关闭就可以了。如下:

            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粘包拆包问题


以上是关于Funny things of nio的主要内容,如果未能解决你的问题,请参考以下文章

funny_python 00 The Zen of Python

Funning things of netty

XXE – Things Are Getting Out of Band

Tip of the Week #65: Putting Things in their Place

Tip of the Week #65: Putting Things in their Place

number field is the union of the set of all strings and the set of all numbers. The set of things th