1、什么是 随机访问文件流 RandomAccessFile
这个类在很多资料上翻译成中文都是:随机访问文件,在中文里,随机是具有不确定的含义,指一会访问这里,一会访问那里的意思。如果以这种语义来解释的话,就会感到很困惑。其实,Random在英文中不仅仅有随机,还有任意的意思。如果中文名为任意访问文件是不是就会更好的理解。任意表示我们可以指定文件中任何一个位置去操作一个文件。
RandomAccessFile适用于大小已知的文件,能够随机的读取或者写入文件。可以通过使用seek()将记录从一处转移到另外一处,然后读取或者修改记录。文件中记录的大小不一定相同,只要我们能确定记录的大小和它们在文件的位置即可。
2、RandowAccessFile存在的价值
1、是JAVA I/O流体系中功能最丰富的文件内容访问类,它提供了众多方法来访问文件内容。
2、由于可以自由访问文件的任意位置,所以如果需要访问文件的部分内容,RandomAccessFile将是更好的选择。
3、可以用来访问保存数据记录的文件,文件的记录的大小不必相同,但是其大小和位置必须是可知的。
3、RandomAccessFile的使用
1 public class RandomFileDemo { 2 3 public static void main(String[] args) { 4 5 try { 6 RandomAccessFile raf = new RandomAccessFile(new File("E:\\a.txt"), "rw"); 7 long offset = raf.getFilePointer();//文件指针 8 long len= raf.length();//当前文件的字节大小 9 System.out.println("offset:"+offset+" len:"+len); 10 //raf.seek(len);//移动到文件末尾,可进行追加文件内容 11 System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length()); 12 raf.write(65);//1字节 13 raf.writeChar(97);//2字节 14 raf.writeChar('\n');//2字节 15 raf.writeBytes("test");//4字节 16 System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length()); 17 18 19 raf.seek(0);//移动文件指针到开始位置 20 int c = raf.read(); 21 System.out.println(c+" "+(byte)c+" "+(char)c);//从指定位置开始读取一个字节 22 23 System.out.println(raf.readChar());//从文件指针(类似一个游标)位置开始读取一个字符(2个字节) 24 //再次回到文件的开始位置,读取一行 25 raf.seek(0); 26 System.out.print(Arrays.toString(raf.readLine().getBytes())+" "); 27 System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length()); 28 raf.close(); 29 30 31 32 33 } catch (Exception e) { 34 e.printStackTrace(); 35 } 36 37 } 38 39 }
结果输出(a.txt是空文件):
offset:0 len:0 offset:0 len:0 offset:9 len:9 65 65 A a [65, 0, 97, 0] offset:5 len:9