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获取
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)方法作用一样。
}
直接缓冲区和非直接缓冲区的比较:
直接缓冲区:
非直接缓冲区:
Java IO流之DataInputStream和DataOutputStream分析
Runtime.getRuntime().exec踩坑总结(/bin/sh -c、异常流重定向)
OP_READ
断开连接后,为了让你知道连接已断开,所以会产生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
触发条件:
正确的处理方式:
Java NIO开发需要注意的坑 https://www.cnblogs.com/qhyuan1992/p/5385289.html
(Java)socket网络编程及处理socket粘包拆包问题
《Java源码解析》之NIO的Selector机制(Part2:SelectableChannel.register(Selector sel, int ops))
《Java 源码分析》:Java NIO 之 Selector(第二部分selector.select())
关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结
图解HTTP,状态码,TCP、UDP等网络协议相关总结(持续更新)