奇怪的输入错误,我之前使用过这段代码

时间:2012-12-27 11:19:05

标签: java eof objectinputstream

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

然而现在,当我编译以测试它时,我收到一个意外错误:

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

2 个答案:

答案 0 :(得分:1)

当然

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

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

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

答案 1 :(得分:1)

  

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

这正是问题所在。您无法从空文件中读取对象(或数组)。它将找不到任何数据并抛出End-of-file-Exception(EOFException)。

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