[Webinar] Streamline your web hosting managementRegister Today

x
?
Solved

ObjectInputStream getting EOFException

Posted on 2006-11-06
3
Medium Priority
?
254 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
  • 3
3 Comments
 
LVL 16

Accepted Solution

by:
Peter Kwan earned 2000 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

Learn to develop an Android App

Want to increase your earning potential in 2018? Pad your resume with app building experience. Learn how with this hands-on course.

Question has a verified solution.

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

INTRODUCTION Working with files is a moderately common task in Java.  For most projects hard coding the file names, using parameters in configuration files, or using command-line arguments is sufficient.   However, when your application has vi…
By the end of 1980s, object oriented programming using languages like C++, Simula69 and ObjectPascal gained momentum. It looked like programmers finally found the perfect language. C++ successfully combined the object oriented principles of Simula w…
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…
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.
Suggested Courses
Course of the Month8 days, 18 hours left to enroll

590 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