Solved

ObjectInputStream getting EOFException

Posted on 2006-11-06
3
236 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

Online Training Solution

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action. Forget about retraining and skyrocket knowledge retention rates.

Question has a verified solution.

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

For beginner Java programmers or at least those new to the Eclipse IDE, the following tutorial will show some (four) ways in which you can import your Java projects to your Eclipse workbench. Introduction While learning Java can be done with…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Viewers learn about the third conditional statement “else if” and use it in an example program. Then additional information about conditional statements is provided, covering the topic thoroughly. Viewers learn about the third conditional statement …
Viewers learn how to read error messages and identify possible mistakes that could cause hours of frustration. Coding is as much about debugging your code as it is about writing it. Define Error Message: Line Numbers: Type of Error: Break Down…

717 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