-1

我正在从文本文件中读取两个字符串和一个双精度,但继续抛出一个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 真的很陌生,不知道如何解决这个异常,并且 throwingEOFExecption似乎不起作用。任何帮助将不胜感激,干杯

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

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 姓名 2 作者 2 12.00

(在文件中,它们都在单独的行上)

4

3 回答 3

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);

上面的代码要求标题、作者和价格在不同的行上。

于 2013-02-20T18:10:58.523 回答
0

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

首先,读取两个字节并使用 readUnsignedShort 方法的方式构造一个无符号的 16 位整数。这个整数值称为 UTF 长度,并指定要读取的附加字节数。

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

于 2013-02-20T18:04:27.483 回答
0

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

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

于 2013-02-21T00:20:02.630 回答