0

在做了一次非常糟糕的家庭作业之后,我决定放弃一切并从头开始会更快。好吧,不是所有的……我复制了这部分,因为它工作得很好,所以我认为没有必要修改它。虽然可能并不完美,但它确实有效。

但是现在,当我编译只是为了测试它时,我收到了一个意外错误:

Input error: java.io.EOFException.

请注意,“输入错误”来自我的catch(IOException ioe).

文件 ( fileName) 完全为空。里面什么都没有。这是什么原因造成的。如果文件为空,有没有办法告诉ObjectInputStream什么都不做?

我也在我的另一个“迭代”中用一个空文件测试了这个,没有这个问题。我什至将我的文件命名为相同的。

public Repository (String fileName) throws  FileNotFoundException,
                                            IOException,
                                            SecurityException,
                                            ClassNotFoundException {
    this.fileName = fileName;
    this.clients = new ArrayList<Client> ();

    FileInputStream fileIn = null;
    ObjectInputStream in = null;

    try {
        fileIn = new FileInputStream(this.fileName);
        in = new ObjectInputStream(fileIn);
        this.clients = (ArrayList<Client>) in.readObject();

    } catch (FileNotFoundException fnfe) {
        System.out.println("File not found, error: " + fnfe);
    } catch (IOException ioe) {
        System.out.println("Input error: " + ioe);
    } catch (ClassNotFoundException cnfe) {
        System.out.println("Class not found, error: " + cnfe);
    } catch (SecurityException se) {
        System.out.println(
                       "You do not have permission to access this file, error: " 
                       + se);
    } finally {
        if (fileIn != null)
            fileIn.close();
        if (in != null)
            in.close();
}
4

2 回答 2

1

肯定是之前

    in = new ObjectInputStream(fileIn);
    this.clients = (ArrayList<Client>) in.readObject();

您想通过File.length()检查文件大小。

我假设如果它是空的,那么你会想要返回一个空数组列表。你不能通过反序列化一个空文件来做到这一点。毕竟,即使是空数组列表的大小也不为零(并且需要通过序列化属性将自己标识为数组列表)

于 2012-12-27T11:21:47.970 回答
1

文件 (fileName) 完全为空。里面什么都没有。

这正是问题所在。您不能从空文件中读取对象(或数组)。它不会找到任何数据并抛出文件结束异常 (EOFException)。

即使是空数组——当序列化为文件时——也会产生一些数据,因为对象流会将数组的类型 (ArrayList) 和大小 (0) 写入文件。当您尝试读取它时,它会期望找到此数据。

于 2012-12-27T11:26:28.957 回答