(Java)从文本文件中读取时的EOFException

时间:2013-02-20 18:01:51

标签: java io eofexception

我正在从文本文件中读取两个字符串和一个double,但继续抛出EOFException。 这是我的代码:

public static Book readBook(String pathname) throws IOException, FileNotFoundException{
      DataInputStream dis = new DataInputStream(
                                new BufferedInputStream(
                                    new FileInputStream(fn)));
      String theTitle = dis.readUTF();
      String theAuthor = dis.readUTF();
      double thePrice = dis.readInt();
      dis.close();
      return new Book(theTitle, theAuthor, thePrice);
   } 

我对IO非常陌生,并且不知道如何解决此异常,抛出EOFExecption似乎不起作用。任何帮助将不胜感激,干杯

编辑:堆栈跟踪+文件内容

Exception in thread "main" java.io.EOFException
    at java.io.DataInputStream.readFully(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at Model.readBook(Model.java:48)
    at Model.runApp(Model.java:17)
    at Main.main(Main.java:8)

文件内容

名 作者 10.00 NAME2 author2 12.00

(在档案中,他们都在单独的行上)

3 个答案:

答案 0 :(得分:1)

如果这是文本文件,那么您可能需要使用Scanner:

Scanner scanner = new Scanner (new FileInputStream (fn));
String theTitle = scanner.nextLine ();
String theAuthor = scanner.nextLine ();
double thePrice = scanner.nextDouble ();
return new Book(theTitle, theAuthor, thePrice);

上面的代码要求标题,作者和价格分开。

答案 1 :(得分:0)

您的文字输入是如何格式化的?您是否指定了要在输入中读取的字符串的长度?我的想法是你没有,或指定长度错误,并且在随后的一次读取之前击中了文件的末尾。

  

首先,读取两个字节并用于构造无符号的16位整数,其方式与readUnsignedShort方法完全相同。此整数值称为UTF长度,并指定要读取的其他字节数。

http://docs.oracle.com/javase/6/docs/api/java/io/DataInput.html#readUTF()

答案 2 :(得分:0)

  

我正在从文本文件中读取两个字符串和一个双精度

不,你不是。您正在读取两个writeUTF()结果和二进制文件中的整数。如果它不是二进制文件,则使用错误的代码。您需要逐行读取文件,可能在空格上拆分每一行,并使用Double.parseDouble()解析双精度。或者,使用java.util.Scanner使整个事情变得更容易。