0

I am making an Email Client(for class) and i want to store the messages i send everyday in a single file.I am going to use serialization for this.I tried appending to a file by setting append to true in FileOutputStream.Below is the code i wrote.But it throws a StreamCorruptedException(stack trace given below).I cannot seem to find the reason why.I would like to know whether there is a better way to store multiple objects to a single file using serialization.Any help is appreciated.Thanks in advance.

//For reading and writing objects to files

interface MyFileHandler<T> {
    public void write(T input );
    public ArrayList<T> read();

}





class FileHandlerObject implements MyFileHandler<EmailMessage>
    {
        
    public void write(EmailMessage input){
        

        try{
            FileOutputStream fileOutputStream = new FileOutputStream("emails.ser",true);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(input);
            objectOutputStream.flush();
            objectOutputStream.close();
        }

        catch(IOException e)
        {
            e.printStackTrace();
        }
    }

    public ArrayList<EmailMessage> read(){
        ArrayList<EmailMessage> messages=new ArrayList<EmailMessage>();
       
        try{
            FileInputStream fileInputStream=new FileInputStream("emails.ser");
            ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
            boolean cont = true;
            
            while (cont) {
                if(fileInputStream.available()!=0)
                {
                Object obj=objectInputStream.readObject();
                EmailMessage message=(EmailMessage)obj;
                messages.add(message);
                }
               
                else{
                    cont=false;
                }
                
            }
            
            objectInputStream.close();

            return messages;
            
        
        }
            catch(IOException e)
            {
                e.printStackTrace();
            }
            
            catch(ClassNotFoundException c)
            {
                c.printStackTrace();
            }
            catch(ClassCastException c) 
            {
                c.printStackTrace();
            }

            

            return null;

        }




        public static void main(String[] args) {
            FileHandlerObject f=new FileHandlerObject();
            
            ArrayList<EmailMessage> a=f.read();
            
            a=f.read();
            

        }
        
    }

And the Email Message class that i serialize

public class EmailMessage implements Serializable{//implement serializables
    private String recipient;
    private String subject;
    private String content;
    private String date;

    public void setRecipient(String recipient)
    {
        this.recipient=recipient;
    }

    public String getRecipient()
    {
        return this.recipient;
    }

    public void setSubject(String subject){
        this.subject=subject;
    }

    public void setContent(String content){
        this.content=content;
    }

    public String getSubject(){
        return this.subject;
    }



    public String getContent(){
        return this.content;
    }

    public void setDate(String date)
    {
        this.date=date;
    }

    public String getDate()
    {
        return this.date;
    }

    public String printDetails()
    {
        String details="Recipient: "+getRecipient()+
                        "\nSubject: "+getSubject()+
                        "\nEmail content: "+getContent()+
                        "\nDate Sent: "+getDate(); 
        return details;
    }}

And below is the stack trace

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1723)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:508)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:466)
    at FileHandlerObject.read(MyFileHandler.java:46)
    at FileHandlerObject.main(MyFileHandler.java:89)
scout
  • 11
  • 3
  • Good old invalid type code AC problem: https://stackoverflow.com/questions/2393179/streamcorruptedexception-invalid-type-code-ac – MMZK1526 Aug 13 '22 at 03:18
  • Does this answer your question? [StreamCorruptedException: invalid type code: AC](https://stackoverflow.com/questions/2393179/streamcorruptedexception-invalid-type-code-ac) – tgdavies Aug 13 '22 at 03:23
  • Thank you, does this mean i have to use a single ObjectOutputStream in the file handler object without creating a new one each time.Also this means i have to only have a single FindHandlerObject instance in my application right? – scout Aug 13 '22 at 03:31
  • Thank you everyone, i finally found the solution https://www.geeksforgeeks.org/how-to-fix-java-io-streamcorruptedexception-invalid-type-code-in-java/ – scout Aug 13 '22 at 04:24

0 Answers0