III . 映射字节缓冲区 ( MappedByteBuffer )
1 . 映射字节缓冲区 ( MappedByteBuffer ) : 在内存中修改文件 , 不需要将文件中的内容拷贝到内存中 , 再修改后 , 写回到文件 , 其性能提高了很多 ;
① 内存说明 : 修改文件的内存并不是堆内存 , 而是在堆外内存中 ;
② MappedByteBuffer 类结构 :
MappedByteBuffer 继承 ByteBuffer 抽象类 ;
MappedByteBuffer 本身也是抽象类 , 其有两个子类 , 分别是 DirectByteBuffer , DirectByteBufferR ;
③ 可操作区域 : fc.map(FileChannel.MapMode.READ_WRITE, 0, 10); 的 MappedByteBuffer 只能操作 从 0 索引开始的 10 个字节 , 即从 0 到 9 索引代表的字节 , 其中的 10 代表可操作性的字节个数 , 并不是索引值 ;
2 . 代码示例 :
package kim.hsl.nio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class MappedByteBufferDemo { public static void main(String[] args) { RandomAccessFile randomAccessFile = null; try { randomAccessFile = new RandomAccessFile("file.txt", "rw"); FileChannel fc = randomAccessFile.getChannel(); //FileChannel.MapMode.READ_WRITE : 指的是读写模式 //0 : 将文件从 0 位置开始映射到内存中 //10 : 将文件从 0 位置开始映射到内存中的大小 //即 将 file.txt 文件从 0 开始的 10 字节映射到内存中 MappedByteBuffer mappedByteBuffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, 10); mappedByteBuffer.put(0, (byte) 'N'); mappedByteBuffer.put(1, (byte) 'N'); } catch (IOException e) { e.printStackTrace(); } finally { try { if(randomAccessFile != null) randomAccessFile.close(); } catch (IOException e) { e.printStackTrace(); } } } }
执行结果 : 在 IntelliJ IDEA 环境中打开没有刷新 , 在文件浏览器中打开 , “Hello World” 的前两位变成了 “NN” ;