Solved

ObjectInputStream getting EOFException

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

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

Are you developing a Java application and want to create Excel Spreadsheets? You have come to the right place, this article will describe how you can create Excel Spreadsheets from a Java Application. For the purposes of this article, I will be u…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
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 about the “for” loop and how it works in Java. By comparing it to the while loop learned before, viewers can make the transition easily. You will learn about the formatting of the for loop as we write a program that prints even numbers…

707 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

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now