aspose file tools *
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes Problem with ObjectInputStream Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "Problem with ObjectInputStream" Watch "Problem with ObjectInputStream" New topic
Author

Problem with ObjectInputStream

Sandeep Ghosh
Greenhorn

Joined: Mar 10, 2001
Posts: 22

Hi All
I have created a class student whose 2 objects will be serialized to MyStudent.txt file .Problem is when I am trying to read both record it is giving java.io.StreamCorruptedException.
Can any body help with the solution
Thank in adv
Sandeep
import java.io.*;
class student implements Serializable
{
String name,address;
int age,marks;
public void getdata(String n,String a,int age1,int m)
{
name=n;
address=a;
age=age1;
marks=m;
}
public String getname()
{
return name;
}
public String getaddress()
{
return address;
}
public int getage()
{
return age;
}
public int getmarks()
{
return marks;
}

}

class writerecords
{

public void writerecord(student s)
{
try{
FileOutputStream f=new FileOutputStream("Student.txt",true);
ObjectOutputStream o=new ObjectOutputStream(f);
o.writeObject(s);
f.close();
o.close();
}catch(Exception e){System.out.println("There is a error in writerecord");}
}
public void readrecord()
{
try{
student s;
FileInputStream f=new FileInputStream("Student.txt");
ObjectInputStream o=new ObjectInputStream(f);
s=(student)o.readObject();
System.out.println(s.getname()+"\t"+s.getaddress()+"\n");
//read the second record
s=(student)o.readObject();
System.out.println(s.getname()+"\t"+s.getaddress()+"\n");\
o.close
}
catch(EOFException e)
{
System.out.println("End of File Reached");
System.exit(1);
}
catch(Exception ef)
{
System.out.println("Error");
}
}
public static void main(String args[])
{

student stud=new student();
stud.getdata("Mr x","India",23,56);
writerecords w=new writerecords();
w.writerecord(stud);
//writing the second record
stud.getdata("Mr Y","Bangladesh",46,54);
w.writerecord(stud);
w.readrecord();

}
}
Exception
java.io.StreamCorruptedException: Type code out of range, is -84
at java.io.ObjectInputStream.peekCode(ObjectInputStream.java:1280)
at java.io.ObjectInputStream.refill(ObjectInputStream.java:1401)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:273)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:232)
at writerecords.readrecord(writerecords.java:56)
at writerecords.main(writerecords.java:80)
Valentin Crettaz
Gold Digger
Sheriff

Joined: Aug 26, 2001
Posts: 7610
Hi, I made you something for you to understand how this all works. I have redesigned a little bit the classes in order to get something more robust...
One thing though, the code below works only for one Student, if you want to write more of them, you have to keep track of the file pointer and read subsequent object from there (I let you this as an exercise )
Here is the code, in two separate file (Serializer.java and Student.java), just put them in the same directory and run javac Serializer.java and then java Serializer and this should work.



Ok let me know if you have trouble understanding the code...
HIH
Val


SCJP 5, SCJD, SCBCD, SCWCD, SCDJWS, IBM XML
[Blog] [Blogroll] [My Reviews] My Linked In
Ragu Sivaraman
Ranch Hand

Joined: Jul 20, 2001
Posts: 464
Originally posted by Sandeep Ghosh:

Hi All
I have created a class student whose 2 objects will be serialized to MyStudent.txt file .Problem is when I am trying to read both record it is giving java.io.StreamCorruptedException.
Can any body help with the solution
Thank in adv
Sandeep
import java.io.*;
class student implements Serializable
{
String name,address;
int age,marks;
public void getdata(String n,String a,int age1,int m)
{
name=n;
address=a;
age=age1;
marks=m;
}
public String getname()
{
return name;
}
public String getaddress()
{
return address;
}
public int getage()
{
return age;
}
public int getmarks()
{
return marks;
}

}

class writerecords
{

public void writerecord(student s)
{
try{
FileOutputStream f=new FileOutputStream("Student.txt",true);
ObjectOutputStream o=new ObjectOutputStream(f);
o.writeObject(s);
f.close();
o.close();
}catch(Exception e){System.out.println("There is a error in writerecord");}
}
public void readrecord()
{
try{
student s;
FileInputStream f=new FileInputStream("Student.txt");
ObjectInputStream o=new ObjectInputStream(f);
s=(student)o.readObject();
System.out.println(s.getname()+"\t"+s.getaddress()+"\n");
//read the second record
s=(student)o.readObject();
System.out.println(s.getname()+"\t"+s.getaddress()+"\n");\
o.close
}
catch(EOFException e)
{
System.out.println("End of File Reached");
System.exit(1);
}
catch(Exception ef)
{
System.out.println("Error");
}
}
public static void main(String args[])
{

student stud=new student();
stud.getdata("Mr x","India",23,56);
writerecords w=new writerecords();
w.writerecord(stud);
//writing the second record
stud.getdata("Mr Y","Bangladesh",46,54);
w.writerecord(stud);
w.readrecord();

}
}
Exception
java.io.StreamCorruptedException: Type code out of range, is -84
at java.io.ObjectInputStream.peekCode(ObjectInputStream.java:1280)
at java.io.ObjectInputStream.refill(ObjectInputStream.java:1401)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:273)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:232)
at writerecords.readrecord(writerecords.java:56)
at writerecords.main(writerecords.java:80)

To make this code work without error
You must not append to the file when you write
AND Comment the section below
***********************
//read the second record
s=(student)o.readObject();
System.out.println(s.getname()+"\t"+s.getaddress()+"\n");\
**********************
If you observe this code
It seems that two different records aka objects are written to a file...ie "India" first and then "Bangladesh" second which is assumed that its being appended
But in reality thats not what happening,
calling
FileOutputStream f=new FileOutputStream("Student.txt",true);
ObjectOutputStream o=new ObjectOutputStream(f);
this above code twice DOES NOT APPEND instead it CORRUPTS
To append to the file, use RandomAccessFile
and move filepointer to read and write

Let me know if it helps
Ragu

Valentin Crettaz
Gold Digger
Sheriff

Joined: Aug 26, 2001
Posts: 7610
Rigth Ragu, so Sandeep remove the "true" literal in the instantiation of the FileOutputStream in writeToFile...
Val
Sandeep Ghosh
Greenhorn

Joined: Mar 10, 2001
Posts: 22
Hi Ragu and Valentin
Thanks a lot for help,but I still I have one question left.Why we use true in ObjectOutputStream constructor
Sandeep
Ragu Sivaraman
Ranch Hand

Joined: Jul 20, 2001
Posts: 464
Originally posted by Sandeep Ghosh:
Hi Ragu and Valentin
Thanks a lot for help,but I still I have one question left.Why we use true in ObjectOutputStream constructor
Sandeep

Hello Sandeep...
ObjectOutputStream do not have a constructor with an append mode
The "true" you mentioned is to ensure that the written datas can be appended to the existing file.
Normally appending is a low-level stream mechanism ie like File

Hope it helps you
Ragu
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Problem with ObjectInputStream