Solved

ObjectInputStream getting EOFException

Posted on 2006-11-06
3
231 Views
Last Modified: 2010-03-31
What I'm attempting to do is read in a serialized object (in this case hashtable) from a file and add a new element to it and rewrite it back to the file with the updated hashtable, then later I will go back through and remove the elements from the hashtable in the temporary file when i don't need them in processing anymore.   I'm getting an EOFException when trying to read in the object.

Note: The first time it hits the EOFException, i was assuming that the hashtable had not been added to the file at that time so I add a new one.  But it seems to hit EOFException every time without pulling the hashtable, so in other words it's like it's writing a new hashtable everytime it's run.

FileInputStream filein = null;
FileOutputStream fileout = null;
ObjectOutputStream objout = null;
ObjectInputStream objin = null;
SecretKey key = null;

try {
         response.setContentType("text/html");
         out = response.getWriter();

         // create encryption key
         key = KeyGenerator.getInstance("DES").generateKey();
       
         // read in key file
         filein = new FileInputStream(filepath);
         fileout = new FileOutputStream(filepath);
         objout = new ObjectOutputStream(fileout);
         objin = new ObjectInputStream(filein);
       
         // read in hashtable of member ids and keys
         mem_keys = (Hashtable)objin.readObject();        
         mem_keys.put(member.member_id, key); // add the new member to the hashtable
         objout.writeObject(mem_keys); // write back out

         // init the DES encryptor
         DesEncrypter des = new DesEncrypter(key);
         if(password.compareTo(confirm) == 0) {
            // encrypt password using SecretKey DES encryptor
            member.password = des.encrypt(password);
         }
}
catch(EOFException e) {
        // to print the error to screen
        //out.println("<PRE>" + e.getMessage() + "<BR>");
        //e.printStackTrace(out);

        // since we are keeping only one hashtable in the file
        // and it's end of file, then no objects where found so create new hashtable to add to
        mem_keys = new Hashtable();
        mem_keys.put("" + member.member_id, key);
        try {
             objout.writeObject(mem_keys.clone());
        }
        catch(Exception ex) {
            out.println("<PRE>" + ex.getMessage() + "<BR>");
            ex.printStackTrace(out);
        }
}
catch(IOException e) {
        out.println("<PRE>" + e.getMessage() + "<BR>");
        e.printStackTrace(out);
}
catch(Exception e) {
        out.println("<PRE>" + e.getMessage() + "<BR>");
        e.printStackTrace(out);
}
     
// clean up
try {
        objin.close();
        filein.close();
        objout.flush();
        objout.close();
        fileout.close();
}
catch(Exception e) {
        out.println("<PRE>" + e.getMessage() + "<BR>");
        e.printStackTrace(out);
}

Any thoughts?  thanks
0
Comment
Question by:tbboyett
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
3 Comments
 
LVL 16

Accepted Solution

by:
Peter Kwan earned 500 total points
ID: 17886614
Since your code:

         filein = new FileInputStream(filepath);
         fileout = new FileOutputStream(filepath);

filepath are the same, therefore, they are pointing to the same file and the file is re-created to be empty every time before you read in object.
0
 
LVL 16

Expert Comment

by:Peter Kwan
ID: 17886617
You should move the following lines:

         fileout = new FileOutputStream(filepath);
         objout = new ObjectOutputStream(fileout);

after

mem_keys = (Hashtable)objin.readObject();  
0
 
LVL 16

Expert Comment

by:Peter Kwan
ID: 17886625
A better way is :

try {
         response.setContentType("text/html");
         out = response.getWriter();

         // create encryption key
         key = KeyGenerator.getInstance("DES").generateKey();
       
         // read in key file
         filein = new FileInputStream(filepath);
         objin = new ObjectInputStream(filein);
       
         // read in hashtable of member ids and keys
         mem_keys = (Hashtable)objin.readObject();        
         mem_keys.put(member.member_id, key); // add the new member to the hashtable

        objin.close();
        filein.close();

         fileout = new FileOutputStream(filepath);
         objout = new ObjectOutputStream(fileout);
         objout.writeObject(mem_keys); // write back out

        objout.flush();
        objout.close();
        fileout.close();

         // init the DES encryptor
         DesEncrypter des = new DesEncrypter(key);
         if(password.compareTo(confirm) == 0) {
            // encrypt password using SecretKey DES encryptor
            member.password = des.encrypt(password);
         }
}
catch(EOFException e) {
        // to print the error to screen
        //out.println("<PRE>" + e.getMessage() + "<BR>");
        //e.printStackTrace(out);

        // since we are keeping only one hashtable in the file
        // and it's end of file, then no objects where found so create new hashtable to add to
        mem_keys = new Hashtable();
        mem_keys.put("" + member.member_id, key);
        try {
             objout.writeObject(mem_keys.clone());
        }
        catch(Exception ex) {
            out.println("<PRE>" + ex.getMessage() + "<BR>");
            ex.printStackTrace(out);
        }
}
catch(IOException e) {
        out.println("<PRE>" + e.getMessage() + "<BR>");
        e.printStackTrace(out);
}
catch(Exception e) {
        out.println("<PRE>" + e.getMessage() + "<BR>");
        e.printStackTrace(out);
}
     
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
fibonacci ten numbers 4 54
arguments to jar 5 40
spring jars download 1 53
Bot application - advice 3 63
An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
The viewer will learn how to implement Singleton Design Pattern in Java.
This video teaches viewers about errors in exception handling.

733 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question