首页 > 编程知识 正文

内存映射文件方法,selectionkey四个事件

时间:2023-05-06 04:39:05 阅读:44813 作者:3429

randomaccessfilerandomaccessfile用于访问存储数据记录的文件。 seek ) )方法来访问和读写日志。 这些记录的大小不必相同; 但是,必须知道其大小和位置。 但是,此类仅限于操作文件。

random访问文件不属于InputStream和OutputStream类。 实际上,除了实现数据输入和数据输出接口外,数据输入和数据输出流也实现了这两个接口。 它与这两个类无关,也不使用InputStream和OutputStream类中已经存在的功能。 它是一个完全独立的类,所有方法(大多数属于自己)都是从零开始编写的。 这可能是因为RandomAccessFile在文件中前后移动,与其他I/O类的行为根本不同。 总之,它是直接继承Object的独立类。

基本上,RandomAccessFile的工作原理是将数据输入和数据输出流组合起来,并使用getFilePointer (,用于在文件中移动的seek ) ), 添加自己的方法(如lennter )以确定文件大小。此外,构造函数还有一个参数,指示是使用只读“r”打开文件,还是使用读/写“rw”打开文件这和c的fopen (一模一样。 不支持仅写入文件。

只有RandomAccessFile有seek搜索方法,但此方法仅适用于文档。 BufferedInputStream有一个qsdkf )方法,可以使用该方法设置标记(将结果保存到内部变量)并返回到此位置,但功能太弱,不太实用。

RandomAccessFile的大部分功能,但不是全部。 已被JDK 1.4的nio中的“内存映射文件”替换。 请考虑是否使用“内存映射文件”代替RandomAccessFile。

import java.io.IOException; import Java.io.random访问文件; publicclasstestrandomaccessfile { publicstaticvoidmain [ ] args } throwsioexception { randomaccessfilerf=newrandomaccessfilerf i 10; I ()//写入基本型双精度数据RF.write双精度(I*1.414 ); }rf.close (; RF=newrandomaccessfile (' rtest.dat ',' rw ' ); //将文件指针直接移动到第五个双精度数据之后RF.seek(5*8);//第六个双精度数据RF.writedouble(47.0001 ); 射频. close (; RF=newrandomaccessfile (' rtest.dat ',' r ' ); for(intI=0; i 10; I ) system.out.println (' value ' I ' : ' RF.read double ) ); }rf.close (; }内存映射文件内存映射文件允许您创建和修改太大而无法放入内存的文件。 有了内存映射文件,您可以将所有文件视为已导入内存,并将其作为非常大的数组进行访问。 此解决方案大大简化了修改文件的代码。

file channel.map (file channel.mapmodemode,long position,long size ) )将此通道的文件区域直接映射到内存。 请注意,必须指示从文件的哪个位置映射,映射的范围是多少。 也就是说,可以映射大文件的小片段。

因为MappedByteBuffer是ByteBuffer的子类,所以它提供了所有ByteBuffer方法,但添加了新的force (,强制将缓冲区内容刷新到存储设备,加载) isLoaded ) )的位置是否存储在内存中的数据和存储设置中,这里简要介绍了put (和get )的方法,但其他方法(如asCharBuffer ) )也用于相应基本类型数据的缓冲区

import Java.io.random访问文件; import Java.nio.mappedbytebuffer; import Java.nio.channels.file channel; publicclasslargemappedfiles { staticintlength=0x 8000000; //128 mbpublicstaticvoidmain (字符串[ ] args ) throwsexception )//为了以可写方式打开文件,在本例中使用随机访问文件filechannelfc=newrandomaccessfile (' test.dat ',' rw ' ).getChannel ); //文件通道的可读写性基于文件流本身的可读写性,由mappedbytebufferout=fc.map (file channel.map mode.read _ write,0,length 写128M内容的for(intI=0; i length; I ) ) out.put((byte ) ' x ' ); } system.out.println (完成写入); //读取文件中间6字节内容的for(intI=length/2; i length/2 6; I ) system.out.print((char ) out.get(i ) ); }fc.close (; }映射写入似乎使用文件输出流,但映射文件中的所有输出必须使用random访问文件。 但是,如果只能读取文件inputstream,则在写入映射文件时必须使用随机访问文件。 写入时可能有读取的理由

这个程序创建了128Mb的文件。 一次读取内存可能会引起内存溢出,但访问此处似乎只是一瞬间。 这是因为实际读取到内存的只是其中的一小部分,其馀部分位于交换文件中。 现在可以轻松修改超大型文件(最多2 GB )。 请注意,Java将调用操作系统的“文件映射机制”以提高性能。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。