前言:1.由于工作需要,需要学习下Netty框架,随对学习进行整理。方便后期的翻阅。大家也可以借鉴下。
2.学习基于尚硅谷的Netty视频教程,笔记也会查阅其他资料来完善观看视频中本人理解模糊的地方。
MappedByteBuffer是什么?有啥用?
也是缓冲区的一种,可以让文件直接在内存(堆外的内存)中进行修改,操作系统不需要拷贝一次,性能高!
注意:
MappedByteBuffer在使用时,因为不需要拷贝,所以 需要通道所在的流具备读写双向功能,以往创建的FileInputStream或者FileOutputStream等等流都是单向的,不能满足要求,
所以使用 RandomAccessFile 流 来创建文件通道FileChannel
RandomAccessFile是什么?有啥用?
RandomAccessFile是一种 用于I/O操作的 类,但不同于 io包下的 输入输出流类, 它是一个直接继承Object的,独立的类。 我们平常创建流对象关联文件,开始读文件或者写文件都是从头开始的,不能从中间开始, 如果是开多线程下载一个文件我们之前学过的FileWriter或者FileReader等等都无法完成, 而当前介绍的RandomAccessFile他就可以解决这个问题,因为它可以指定位置读,指定位置写的一个类,通常开发过程中,多用于多线程下载一个大文件. 并且,randomAccessFile支持 读写模式,就不用像以前一样创建一个输入流和一个输出流了!
代码示例如下:
public static void main(String[] args) throws Exception {
/* 使用 RandomAccessFile 初始化时 指定 读+写 模式 'rw' 也可以单独指定 读 或者 写。很灵活,
这样创建的FileChannel通道才可以 通过 map方法,获取 可读写 MappedByteBuffer!
*/
RandomAccessFile randomAccessFile = new RandomAccessFile("E:\\test\\1.txt","rw");
FileChannel channel = randomAccessFile.getChannel();
/*
* MappedByteBuffer 可以让文件直接在内存(堆外的内存)中进行修改,操作系统不需要拷贝一次,性能高,
*
* 参数1: FileChannel.MapMode.READ_WRITE 读写模式
* 参数2:起始位置
* 参数3:映射到内存的大小(不是索引位置),5表示5个字节
*/
MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, 5);
//修改文件中第一个字节 改为 H
mappedByteBuffer.put(0,(byte)'H');
//关闭流
randomAccessFile.close();
//至于修改后如何同步回文件则由NIO来完成,
}