疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java RandomAccessFile文件操作详解


 

   

  简介:

  RandomAccessFile类可以对文件随机访问的操作,访问包括读和写操作。该类的读写是基于指针的操作。

  RandomAccessFile对文件进行随机访问操作时有两个模式,一种是只读(r),另一种是读写(rw),需在创建RandomAccessFile对象时传入一个参数进行设置,第一个参数代表要访问的文件,第二个参数代表设置访问模式

  RandomAccessFile(File file,String mode)

  RandomAccessFile(String filename,String mode)

  只读模式: new RandomAccessFile(“filename”,”r”);

  读写模式: new RandomAccessFile(filename,”rw”);

  public static void main(String[] args) throws IOException {

  //以读写方式打开并写入一行文本

  File fis = new File("test.date");

  RandomAccessFile raf = new RandomAccessFile(fis, "rw");

  byte[] writeStr = "this is a demo!".getBytes();

  raf.write(writeStr);

  raf.close();

  //以只读方式打开并读取一行数据

  RandomAccessFile rafRead = new RandomAccessFile("test.date", "r");

  System.out.println(rafRead.readLine());

  rafRead.close();

  }

  运行结果:

  this is a demo!

  RandomAccessFile常用方法汇总:

  void write(int d)

  该方法会根据当前指针所在位置处写入一个字节,是将参数int的”低8位”写出

  int read()

  如果返回-1表示读取到了文件末尾EOF(EOF:End Of File)! 每次读取后自动移动文件指针, 准备下次读取。

  void write(byte[] d)

  根据当前指针所在位置处连续写出给定数组中的所有字节

  void write(byte[] d,int offset,int len)

  根据当前指针所在位置处连续写出给定数组中的部分字节,这个部分是从数组的offset处开始,连续len个字节

  int read(byte[] b)

  从文件中尝试最多读取给定数组的总长度的字节量,并从给定的字节数组第一个位置开始,将读取到的字节顺序存放至数组中,返回值为实际读取到的字节量

  void close()

  RandomAccessFile在对文件访问的操作全部结束后,要调用close()方法来释放与其关联的所有系统资源

  public static void main(String[] args) throws IOException {

  //以读写方式打开并写入一行文本

  File fis = new File("test.dat");

  RandomAccessFile rafw = new RandomAccessFile(fis, "rw");

  byte[] writeStr = "this is a demo! ".getBytes();

  for(int i = 0; i < 10; i++) {

  rafw.write(writeStr, 0, writeStr.length);

  }

  rafw.close();

  //以只读方式打开test.dat

  RandomAccessFile rafr = new RandomAccessFile(fis, "r");

  byte[] rd = new byte[1024];

  int len = -1;

  //循环读取,读到结束后len被重新赋值为-1

  while((len = rafr.read(rd))!= -1) {

  System.out.println(new String(rd));

  }

  System.out.println("读取结束,len="+len);

  rafr.close();

  }

  运行结果:

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  读取结束,len=-1

  文件指针操作:

  RandomAccessFile的读写操作都是基于指针的,也就是说总是在指针当前所指向的位置进行读写操作。

  long getFilePointer()

  获取当前指针位置

  void seek(long pos)

  使用该方法可以移动指针到指定位置。

  int skipBytes(int n)

  尝试跳过输入的 n 个字节以丢弃跳过的字节

  实现文件追加:

  public static void main(String[] args) throws IOException {

  RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");

  //将记录指针移动到文件最后 ,进行追加操作

  raf.seek(raf.length());

  raf.write("追加后的文本 ".getBytes());

  raf.close();

  }

  运行后test.dat文本内容:

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  this is a demo!

  追加后的文本

  总结:

  RandomAccessFile,优点是可以控制指针的位置,对文件进行指定位置的读写操作。

  但是同时也有一些缺点,执行效率比较慢,大量进行指针控制操作很耗内存。