Search code examples
javaeofobjectinputstream

Strange input error, I have used this code before


After a very bad attempt at doing my homework, I decided it would be faster to abandon everything and start from scratch. Well not everything ... I copied this part since it worked perfectly so I saw no need to modify it. While maybe not perfect, it worked.

However now, when I compile just to test it out, I get an unexpected error:

Input error: java.io.EOFException.

Notice that "Input error" is from my catch(IOException ioe).

The file (fileName) is completely empty. Nothing in it. What could cause this. Is there a way to tell the ObjectInputStream to do nothing if the file is empty ?

Also I tested this out with an empty file on my other "iteration", didn't have this problem. I even named my file the same.

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

Solution

  • Surely before

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

    you want to check the file size via File.length().

    I assume if it's empty then you'd want to return an empty array list. You can't do that via deserialising an empty file. After all, even an empty array list has a non-zero size (and would need to identify itself as an array list via serialised attributes)