什么是顺序IO
事实上JAVA具有很多操作文件的方案(方法), 许多程序需要将一些事件记录到本地存储中,常见的如数据库,MQ等,首先文件是许多带数据的块组成的,传统IO操作文件具有一个寻址过程(事实上硬件上也会存在寻道,旋转延迟等因素),小文件尚可,大文件就比较消耗性能和时间,比如数据库分配的文件(本地),顺序IO具备指定位置的功能,但是任然需要我们维护一个偏移量(游标).
MappedByteBuffer
JAVA培训中顺序IO通过MappedByteBuffer实现,与传统IO不同的是,MappedByteBuffer需要使用者提供一个位置(偏移量),详细看以下代码:
mappedByteBuffer.position(index);mappedByteBuffer.put(content.getBytes(StandardCharsets.UTF_8));
代码中可见,通过MappedByteBuffer提供的api position();来指定位置(偏移量),put()进行写操作,详细如下。
写操作
先看代码:
public int write(File file ,String content ,int index,long size){RandomAccessFile randomAccessFile;MappedByteBuffer mappedByteBuffer;try { randomAccessFile = new RandomAccessFile(file,"rw"); //1FileChannel fileChannel = randomAccessFile.getChannel(); //2mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE,0,size); //3 mappedByteBuffer.position(index); //4mappedByteBuffer.put(content.getBytes(StandardCharsets.UTF_8)); //5return mappedByteBuffer.position(); //6}catch (Exception e){e.printStackTrace();}return 0;}
上述代码中标注1位置中使用RandomAccessFile (随机流)来打开文件,此流与传统IO除了兼并读写之外,在一些底层实现方式上也均有不同,在此不多做介绍,感兴趣可另寻资料,在此需记住,此处使用随机流的作用为第二步做准备,且唯一,其中参数1为File对象,构造方法重载的参数1可为文件路径,参数2的取值可有4种,如下(取至JAVA官方文档):
FileInputStream fileInputStream = new FileInputStream(file);FileChannel fileChannel = fileInputStream.getChannel();
运行结果,标记3处抛出异常:NonWritableChannelException 或者:
FileOutputStream fileInputStream = new FileOutputStream(file);FileChannel fileChannel = fileInputStream.getChannel();
运行结果,标记3处抛出异常:NonReadableChannelException 从上可以看到,不管是FileInputStream还是FileOutputStream获取到的IO通道,均有局限性,不适用MappedByteBuffer。
上述代码中标记3位置中,通过IO通道将该文件的内容(或某个区域)直接映射到内存中,并且对该内存做的修改直接会传播到文件(除了PRIVATE模式,后续介绍),通过FileChannel对象的map();api进行映射,参数一指定映射方式,有如下三种(取至JAVA官方文档):
参数二代表从指定位置开始映射,0表示从头开始映射全部内容,参数三表示要映射的区域大小,可超出文件大小(如字符长度为3,此处可填写6或者其他),但不可为负数或超出Integer.MAX_VALUE. 实际上到此处,IO通道已经完成了它的任务,可关闭。(在标记3之后任意位置可执行fileChannel.close()而不影响运行结果) 此处简要说明了个参数的意思,要加深了解建议自己建立Demo并更改此处参数观察运行结果。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。