java的RandomAccessFile提供对文件的读写功能,与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。
实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针 ; 输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开 始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException (是一种 IOException )。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException ,而不是 EOFException 。需要特别指出的是,如果流已被关闭,则可能抛出 IOException 。
在JDK 1.4中,RandomAccessFile的绝大多数功能(但不是全部)已经被nio内存映射文件给取代了。
Java的RandomAccessFile类方法:
Java的RandomAccessFile案例:
文件指针从头开始写入
package com.qunar.bean; import java.io.File; import java.io.RandomAccessFile; import java.util.Arrays; public class FileDemo { public static void main(String[] args) { String pathname = "D:\\Recommended system.txt"; // 创建文件实例 File file = new File(pathname); try { // 判断文件是否存在 if(!file.exists()){ file.createNewFile(); }//if // 读写方式打开文件 RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer()); // write 从当前指针开始写入,写入一个字节 randomAccessFile.write('A'); System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer()); randomAccessFile.write('B'); int num = 0x7fffffff; // 如果用write方法,每次只能写一个字节,需要写4次 randomAccessFile.write(num >>> 24); randomAccessFile.write(num >>> 16); randomAccessFile.write(num >>> 8); randomAccessFile.write(num); System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer()); // 或者是用writeInt方法 一次写入 randomAccessFile.writeInt(num); System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer()); // 文件指针指向文件开头 randomAccessFile.seek(0); // 一次性读取 把文件中内容都读到字节数组中 byte[] buffer = new byte[(int)randomAccessFile.length()]; randomAccessFile.read(buffer); for (byte b : buffer) { // 16进制输出 System.out.print(Integer.toHexString(b)+" "); }//for randomAccessFile.close(); } catch (Exception e) { e.printStackTrace(); } } }
指定任意文件指针位置写入
package com.qunar.bean; import java.io.File; import java.io.RandomAccessFile; public class FileDemo { public static void main(String[] args) { String pathname = "D:\\Recommended system.txt"; // 创建文件实例 File file = new File(pathname); try { // 判断文件是否存在 if(!file.exists()){ file.createNewFile(); }//if // 读写方式打开文件 RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); // 写值 for(int i = 0;i < 5;++i){ randomAccessFile.writeInt(i); }//for // 将文件指针移到第二个Int值后 randomAccessFile.seek(2*4); // 覆盖第三个Int值 randomAccessFile.writeInt(6); // 文件指针指向文件开头 randomAccessFile.seek(0); // 输出 for (int i = 0;i < 5;++i) { System.out.print(randomAccessFile.readInt()+" "); }//for randomAccessFile.close(); } catch (Exception e) { e.printStackTrace(); } } }
从任意文件指针位置读取
package com.qunar.bean; import java.io.File; import java.io.RandomAccessFile; public class FileDemo { public static void main(String[] args) { String pathname = "D:\\Recommended system.txt"; // 创建文件实例 File file = new File(pathname); try { RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); // 以下向file文件中写数据 // 占4个字节 randomAccessFile.writeInt(2015); // 占8个字节 randomAccessFile.writeDouble(12.23); // 占2个字节 randomAccessFile.writeShort(19); System.out.println("当前位置:"+randomAccessFile.getFilePointer()); randomAccessFile.writeUTF("欢迎来到小斯的博客"); System.out.println("当前位置:"+randomAccessFile.getFilePointer()); // 占2个字节 randomAccessFile.writeChar('Y'); System.out.println("当前位置:"+randomAccessFile.getFilePointer()); randomAccessFile.writeUTF("小斯的博客欢迎你"); // 把文件指针位置设置到文件起始处 randomAccessFile.seek(0); System.out.println("读取一个Int值:"+randomAccessFile.readInt()); System.out.println("读取一个Double值:"+randomAccessFile.readDouble()); System.out.println("读取一个Short值:"+randomAccessFile.readShort()); System.out.println("读取一个字符串:"+randomAccessFile.readUTF()); // 将文件指针跳过2个字节 randomAccessFile.skipBytes(2); System.out.println("读取一个字符串:"+randomAccessFile.readUTF()); randomAccessFile.close(); } catch (Exception e) { e.printStackTrace(); } } }