import java.io.*;
class Student implements Serializable
{ String name=null;
  double height;
  Student(String name,double height)
  { this.name=name;
    this.height=height;
  }
  public void setHeight(double c)
  { this.height=c;
  
  }

}public class ObjectStreamExa
{
  public static void main(String[] arg)
  { Student zhang=new Student("张三",1.65);
    try
     {  File f=new File("G://java code/jackxu/src","good.txt");
     FileOutputStream file=new FileOutputStream(f);
     ObjectOutputStream object_out=new ObjectOutputStream(file);
     object_out.writeObject(zhang);
     FileInputStream file_in=new FileInputStream(f);
     ObjectInputStream object_in=new ObjectInputStream(file_in);
     Student li=(Student)object_in.readObject();
     System.out.println(object_in.readObject());
     li.setHeight(1.78);
     li.name="李四";
     System.out.println(zhang.name+"身高是: "+zhang.height);
     System.out.println(li.name+"身高是: "+li.height);
    
     }
    catch(ClassNotFoundException event)
    {  System.out.println("不能读出对象");
    
    } 
catch(IOException event)
{ System.out.println("can not read file"+event);

}  
  }}
上面的代码是一个对象输入输出流,已经序列化的对象通过调用writeObject()写入到目录中,为什么目录中的还是乱码?这个该怎么改,才不会出现乱码?还有我试着输出object_in.readObject()输入流对象,它应该是个地址值,结果是程序不能运行。有是怎么回事??

解决方案 »

  1.   

    楼主对IO操作还是理解不到位。
    1.ObjectOutputStream 对Java对象进行序列号处理,处理后的数据,不是文本数据,
       所以,该数据保存到文件中,用文本编辑器打开,必然是乱码。
    2.输出流,在写入之后,一般都会调用flush方法,将缓冲区的数据刷到IO中去
       (当然,楼主的目的地是硬盘文件中)。IO读写,一般情况下,操作系统也会建立一定大小的缓冲区。
    3.输出流,在所有写入操作都做完后,应该关闭IO流,调用close方法。
        除了可以回收系统资源外,也会强制刷新系统缓冲区中的数据至硬盘。
    4.object_in引用对应的是输入流对象,流是流动的,当你上面写入一个对象到文件中后,
        下面就只能从那个文件中读取一个对象,再调用读取方法,什么也读不到。
        所以,System.out.println(object_in.readObject());的参数应该是li。
    5.输入流在读取完成后,也要进行关闭,回收系统资源。最后,回答楼主说的乱码问题,我上面已经说明了,
    楼主应该仔细理解Java对象的序列话操作到底干了什么。
    它不是简单的把对象属性值写入IO流中,而是按照一定的数据格式写入的。
    而这种格式,不是记事本、写字板、Word等文本编辑器能够识别的,
    因为,这些数据,压根就不是文本数据。
    只有使用相同版本的Java的ObjectInputStream来进行读取操作。
    并且,流数据,在没有缓冲区的情况下,是不能读取重复数据的。
    也就是说,如果,我的文本文件中,存放12345这五个字符,
    那么,我用流读取一个字符,第一个是字符1,第二次读取,必然是字符2,
    不可能还是字符1,除非你用带缓冲区缓的流对象,这样,你在读取前先做标记,
    读取完了,可以回退到标记处,重复读取数据,
    当然,数据的当前位置和标记位置之间的距离不能超过缓冲区的大小。
      

  2.   

    此句System.out.println(object_in.readObject())的报错是can not read filejava.io.EOFException。创建输入流对象,调用readObject()读取一个对象,直接输出这个对象,应该是一个地址值,不应该报错啊。楼上的解释很详细,谢了。对象输出流把数据写入到文件,产生乱码,有什么方法解决吗?前提是使用对象输出流,其他的流语句也能实行,暂时放一边