A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑白涩 中级黑马   /  2016-2-21 16:46  /  721 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

话说把对象写进文件中一共分几步,或者把一个集合写进文件中存起来,重点是要提取使用,用哪个流可以直接操作呢?

6 个回复

倒序浏览
一般是用Java序列化与反序列化来实现,用ObjectInputStream来实现
序列化步骤:

1:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:

2:通过对象输出流的writeObject()方法写对象:

反序列化步骤:

1:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:

2:通过对象输出流的readObject()方法读取对象:

     正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。

点评

我用了Object的流了,写到文件里了,可是有读不出来了,就是那个readObject()读到末尾的标记是什么?null不对  发表于 2016-2-21 20:15
回复 使用道具 举报
给个例子你吧,可以运行

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class MyTest implements Serializable
{
    private static final long serialVersionUID = 1L;
    private String name="SheepMu";
    private int age=24;
    public static void main(String[] args)
    {//以下代码实现序列化
        try
        {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/my.out"));//输出流保存的文件名为 my.out ;ObjectOutputStream能把Object输出成Byte流
            MyTest myTest=new MyTest();
            oos.writeObject(myTest);
            oos.flush();  //缓冲流
            oos.close(); //关闭流
        } catch (FileNotFoundException e)
        {        
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        fan();//调用下面的  反序列化  代码
    }
    public static void fan()//反序列的过程
    {   
         ObjectInputStream oin = null;//局部变量必须要初始化
        try
        {
            oin = new ObjectInputStream(new FileInputStream("my.out"));
        } catch (FileNotFoundException e1)
        {        
            e1.printStackTrace();
        } catch (IOException e1)
        {
            e1.printStackTrace();
        }      
        MyTest mts = null;
        try {
            mts = (MyTest ) oin.readObject();//由Object对象向下转型为MyTest对象
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }     
         System.out.println("name="+mts.name);   
         System.out.println("age="+mts.age);   
    }
}

点评

话说你那个fan()函数我没大理解,那个码我知道一点,读一个这一个我搞定了,读一串写一串,不知道文件里装了多少对象的情况下,怎么读取呢  发表于 2016-2-21 22:57

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1 很给力!

查看全部评分

回复 使用道具 举报
oin = new ObjectInputStream(new FileInputStream("my.out"));  这句文件路径写错了,改成
oin = new ObjectInputStream(new FileInputStream("d:/my.out"));

要读取多个对象,可以这样是下面这样:

//读取结束标志位:是再次读取一个对象,判定对象是否是空,如果不为null继续读取,如果为null停止读取;
            while((object=objectInputStream.readObject()) != null){
                //对object进行处理
                ......
            }

点评

null不行,我试了,还是报错了,  发表于 2016-2-22 11:10
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马