RandomAceessFile类
RandomAccessFile类是一个专门读写文件的类,封装了基本的IO流,在读写文件内容方面比常规IO流更方便、更灵活。但也仅限于读写文件,无法像IO流一样,可以传输内存和网络中的数据。
RandomAccessFile常用方法和使用方式
- getFilePointer() :获取当前文件的记录指针位置
- seek(long pos):把记录指针移到pos处
- read()和write():读取内容和写入内容
- readXxx()和writeXxx():用于处理各种值类型
- writeBytes()和writeChars()可以写入字符串,编码不一致会造成乱码。所以推荐String.getBytes(),用write()来写入。
总体来说,如果只处理文件的话,使用RandomAccessFile很方便,而且读写方法和IO流都差不多,只是针对不同类型数据进行扩展,使用简单明了。最重要的就是该类的seek()方法,该方法可以指定读写的位置。还有该类构造器需要一个参数来确定使用什么模式。
r:只读模式
rw:读写模式
rwd:和rw差不多,但需要对文件内容每个更新都进行同步。
代码示例:
(一)RandomAccessFile读取文件内容
//rw : 设置模式为读写模式 RandomAccessFile raf = new RandomAccessFile("D:\reviewIO\runtime.txt","rw"); System.out.println("当前记录指针位置:" + raf.getFilePointer()); byte[] buf = new byte[1024]; int len = 0; while((len = raf.read(buf)) != -1) { System.out.println(new String(buf)); }
(二)RandomAccessFile写入数据到文件中
public class Test { public static void main(String[] args) throws IOException { //要读写的数据源 File f = new File("D:\reviewIO\RandomAccessFileTest.txt"); //键盘输入作为数据来源 Scanner sc = new Scanner(System.in); //指定文件不存在就创建同名文件 if(!f.exists()) f.createNewFile(); //rw : 设为读写模式 RandomAccessFile raf = new RandomAccessFile(f,"rw"); System.out.println("当前记录指针位置:" + raf.getFilePointer()); while(true) { String str = sc.next(); raf.writeBytes(str); System.out.println("当前记录指针位置:" + raf.getFilePointer()); //输入end结束循环 if(str.equals("end")) break; } } }
- 使用小结:RandomAccessFile写入数据到文件中不会覆盖文件内容。只要程序每运行一次,该类的记录指针总是为0,这意味着从文件最前端开始读写,所以需要注意。
(三)RandomAccessFile的记录指针放在文件尾部,用于添加内容
public class Test { public static void main(String[] args) throws IOException { //读写的数据源 File f = new File("D:\reviewIO\RAF.txt"); //指定文件不存在就创建同名文件 if(!f.exists()) f.createNewFile(); //rw : 设为读写模式 RandomAccessFile raf = new RandomAccessFile(f,"rw"); System.out.println("当前记录指针位置:" + raf.getFilePointer()); //记录指针与文件内容长度相等 raf.seek(raf.length()); System.out.println("当前文件长度:" + raf.length()); //以字节形式写入字符串 raf.write("ABCDEFG写入尾部".getBytes()); System.out.println("当前记录指针位置:" + raf.getFilePointer()); } }
- 使用小结:如果使用RandomAccessFile添加内容,要把记录指针设为同文件一样的长度,保证在文件的尾部进行写入数据。write()写入中文,使用String.getByte(),保证两者编码一致。