猿问

RandomAccessFile文件读取操作

程序一:

public class Test08 {
 public static void main(String[] args) throws Exception {
  RandomAccessFile raf=new RandomAccessFile("raf.dat", "rw");
  int max=Integer.MAX_VALUE;
  long lon=Long.MAX_VALUE;
  raf.writeInt(max);
  raf.seek(0);
  System.out.println(raf.readInt());
  System.out.println(raf.getFilePointer());
  //插入代码raf.seek(4);
  raf.writeLong(lon);
  System.out.println(raf.readLong());
 }
}

执行结果:

2147483647
4
Exception in thread "main" java.io.EOFException
 at java.io.RandomAccessFile.readInt(Unknown Source)
 at java.io.RandomAccessFile.readLong(Unknown Source)
 at day06.Test08.main(Test08.java:23)

程序二:

public class Test08 {
 public static void main(String[] args) throws Exception {
  RandomAccessFile raf=new RandomAccessFile("raf.dat", "rw");
  int max=Integer.MAX_VALUE;
  long lon=Long.MAX_VALUE;
  raf.writeInt(max);
  raf.writeLong(lon);
  raf.seek(0);
  System.out.println(raf.readInt());
  System.out.println(raf.getFilePointer());
  System.out.println(raf.readLong());
 }
}

结果:2147483647
4
9223372036854775807

两者只是  raf.writeLong(lon); 位置不同,为什么一个包异常,一个正常运行,程序一插入代码任有问题,这是为何啊?

初心者3612361
浏览 2277回答 1
1回答

四无小青年

问题出在readLong()和writeLong()这个两个方法,在JDK API文档中提到过readLong()方法会从当前指针位置开始向后面读取八个字节,如果在读取八个字节之前此文件已到达末尾会抛出EOFException异常。你第一个程序在使用writeLong()之后,文件指针指向了最后一位,此时你再使用readLong()就会在读取八位之前就到达文尾部。第二个程序没有报错是因为你在readLong()之前使用seek()把文件指针移动到了0号位置,此时再使用readLong()就能读完八个字节而不报错了。如果为题主解了惑的话,请采纳
随时随地看视频慕课网APP
我要回答