建设部政务网站建设,wordpress注册增加性别选项,视频网站用什么做的,免费发布网站seo外链转载自 RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的#xff0c;你就可以用seek( )方法来访问记录#xff0c;并进行读写了。这些记录的大小不必相同#xff1b;但是其大小和位置必须是可知的。但是该类仅限于操作文件。 RandomAccessFile不属于I…转载自 RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的你就可以用seek( )方法来访问记录并进行读写了。这些记录的大小不必相同但是其大小和位置必须是可知的。但是该类仅限于操作文件。 RandomAccessFile不属于InputStream和OutputStream类系的。实际上除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口)它和这两个类系毫不相干甚至不使用InputStream和OutputStream类中已经存在的任何功能它是一个完全独立的类所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动所以它的行为与其它的I/O类有些根本性的不同。总而言之它是一个直接继承Object的独立的类。 基本上RandomAccessFile的工作方式是把DataInputStream和DataOutputStream结合起来再加上它自己的一些方法比如定位用的getFilePointer( )在文件里移动用的seek( )以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外它的构造函数还要一个表示以只读方式(r)还是以读写方式(rw)打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。 只有RandomAccessFile才有seek搜寻方法而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法你可以用它来设定标记(把结果保存在一个内部变量里)然后再调用reset( )返回这个位置但是它的功能太弱了而且也不怎么实用。 RandomAccessFile的绝大多数功能但不是全部已经被JDK 1.4的nio的内存映射文件(memory-mapped files)给取代了你该考虑一下是不是用内存映射文件来代替RandomAccessFile了。
Java代码
import java.io.IOException; import java.io.RandomAccessFile; public class TestRandomAccessFile { public static void main(String[] args) throws IOException { RandomAccessFile rf new RandomAccessFile(rtest.dat, rw); for (int i 0; i 10; i) { //写入基本类型double数据 rf.writeDouble(i * 1.414); } rf.close(); rf new RandomAccessFile(rtest.dat, rw); //直接将文件指针移到第5个double数据后面 rf.seek(5 * 8); //覆盖第6个double数据 rf.writeDouble(47.0001); rf.close(); rf new RandomAccessFile(rtest.dat, r); for (int i 0; i 10; i) { System.out.println(Value i : rf.readDouble()); } rf.close(); } }
内存映射文件
内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件。有了内存映射文件你就可以认为文件已经全部读进了内存然后把它当成一个非常大的数组来访问。这种解决办法能大大简化修改文件的代码。 fileChannel.map(FileChannel.MapMode mode, long position, long size)将此通道的文件区域直接映射到内存中。注意你必须指明它是从文件的哪个位置开始映射的映射的范围又有多大也就是说它还可以映射一个大文件的某个小片断。 MappedByteBuffer是ByteBuffer的子类因此它具备了ByteBuffer的所有方法但新添了force()将缓冲区的内容强制刷新到存储设备中去、load()将存储设备中的数据加载到内存中、isLoaded()位置内存中的数据是否与存储设置上同步。这里只简单地演示了一下put()和get()方法除此之外你还可以使用asCharBuffer( )之类的方法得到相应基本类型数据的缓冲视图后可以方便的读写基本类型数据。
Java代码
import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class LargeMappedFiles { static int length 0x8000000; // 128 Mb public static void main(String[] args) throws Exception { // 为了以可读可写的方式打开文件这里使用RandomAccessFile来创建文件。 FileChannel fc new RandomAccessFile(test.dat, rw).getChannel(); //注意文件通道的可读可写要建立在文件流本身可读写的基础之上 MappedByteBuffer out fc.map(FileChannel.MapMode.READ_WRITE, 0, length); //写128M的内容 for (int i 0; i length; i) { out.put((byte) x); } System.out.println(Finished writing); //读取文件中间6个字节内容 for (int i length / 2; i length / 2 6; i) { System.out.print((char) out.get(i)); } fc.close(); } } 尽管映射写似乎要用到FileOutputStream但是映射文件中的所有输出 必须使用RandomAccessFile但如果只需要读时可以使用FileInputStream写映射文件时一定要使用随机访问文件可能写时要读的原因吧。 该程序创建了一个128Mb的文件如果一次性读到内存可能导致内存溢出但这里访问好像只是一瞬间的事这是因为真正调入内存的只是其中的一小部分其余部分则被放在交换文件上。这样你就可以很方便地修改超大型的文件了(最大可以到2 GB)。注意Java是调用操作系统的文件映射机制来提升性能的。 RandomAccessFile类的应用 收藏
/* * 程序功能演示了RandomAccessFile类的操作同时实现了一个文件复制操作。 */ package com.lwj.demo;
import java.io.*;
public class RandomAccessFileDemo { public static void main(String[] args) throws Exception { RandomAccessFile file new RandomAccessFile(file, rw); // 以下向file文件中写数据 file.writeInt(20);// 占4个字节 file.writeDouble(8.236598);// 占8个字节 file.writeUTF(这是一个UTF字符串);// 这个长度写在当前文件指针的前两个字节处可用readShort()读取 file.writeBoolean(true);// 占1个字节 file.writeShort(395);// 占2个字节 file.writeLong(2325451l);// 占8个字节 file.writeUTF(又是一个UTF字符串); file.writeFloat(35.5f);// 占4个字节 file.writeChar(a);// 占2个字节 file.seek(0);// 把文件指针位置设置到文件起始处 // 以下从file文件中读数据要注意文件指针的位置 System.out.println(——————从file文件指定位置读数据——————); System.out.println(file.readInt()); System.out.println(file.readDouble()); System.out.println(file.readUTF()); file.skipBytes(3);// 将文件指针跳过3个字节本例中即跳过了一个boolean值和short值。 System.out.println(file.readLong()); file.skipBytes(file.readShort()); // 跳过文件中“又是一个UTF字符串”所占字节注意readShort()方法会移动文件指针所以不用加2。 System.out.println(file.readFloat()); //以下演示文件复制操作 System.out.println(——————文件复制从file到fileCopy——————); file.seek(0); RandomAccessFile fileCopynew RandomAccessFile(fileCopy,rw); int len(int)file.length();//取得文件长度字节数 byte[] bnew byte[len]; file.readFully(b); fileCopy.write(b); System.out.println(复制完成); } }
运行结果同时生成相应的文件
——————从file文件指定位置读数据—————— 20 8.236598 这是一个UTF字符串 2325451 35.5