Java 怎样将多个对象读取出来,怎样判断是否读完?

我在文件中存入了多个对象,怎样在读取时判断是否读完,我用捕获异常方法,他只能读取第一个对象,就会抛java.io.StreamCorruptedException:inv... 我在文件中存入了多个对象,怎样在读取时判断是否读完,我用捕获异常方法,他只能读取第一个对象,就会抛java.io.StreamCorruptedException: invalid type code: AC,求大神!!
我是在circle类中写了给将当前对象存到文件的方法,在测试类中直接调用追加到文件尾
展开
 我来答
小童鞋_成er
推荐于2017-11-29 · 知道合伙人数码行家
小童鞋_成er
知道合伙人数码行家
采纳数:4650 获赞数:22879
主要从事J2EE工作,热爱Java,用心讨论技术,共同进步。

向TA提问 私信TA
展开全部

您好,提问者:
    将对象存入文件中?是用的序列化吧?

    如果确实报错,下面我写的一个例子,你可以看一下。

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

public class Demo {
    public static void main(String[] args) throws Exception{
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\x.person"));
        oos.writeObject(new Person("张三",20));
        oos.writeObject(new Person("李四",18));
        oos.writeObject(new Person("王五",23));
        oos.writeObject(null);//插入null是用来判断是否读取到结尾。
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\x.person"));
        Object obj = null;
        while((obj= ois.readObject())!=null){ //如果为null就读取到文件结尾了。
            Person person = (Person)obj;
            System.out.println(person);
        }
    }
}
class Person implements Serializable{
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return this.name+":"+this.age;
    }
}
Sephil
2014-07-01 · 知道合伙人IT服务行家
Sephil
知道合伙人IT服务行家
采纳数:616 获赞数:1036
熟悉常用语言和数据库,爱写代码

向TA提问 私信TA
展开全部
你的文件是分多次写入的吧?
java在写对象进文件时,每次写入都会先写一个header,再写对象本身的。
但是读取时只在第一次时才读取header,后面都直接读对象。
如果你多次写入同一个文件,但是读取是一次性读取,就会引起这个问题。

举个例子,如果你是一次性写入文件的,那么文件结构是:
header,obj,obj,obj。。。
多次写入则是
header,obj,header,obj。。。
而你读取是一次性的,是这样读的
header,obj,obj,obj。。。
你用追加方式写入的,就是多次写入的情况,所以会出错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友289c0c0
2019-02-08 · TA获得超过4183个赞
知道大有可为答主
回答量:1531
采纳率:89%
帮助的人:625万
展开全部

序列化读完之后到达文件尾,readObject()方法直接抛出异常,接收对象的变量没有机会变成null,所以用 != null判断不可行。readObject()方法返回的是读到的对象,并不返回整型状态值,所以用 != -1判断也不可行。我通常就是用简单的异常处理:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.time.LocalDate;

public class Main
{
    public static void main(String[] args)
    {
        String url = "C:\\Users\\Administrator\\Desktop\\h.object";
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(url));
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(url)))
        {
            oos.writeObject(new Person("Hippo", "20190001", 24));
            oos.writeObject(new Person("Rhino", "20190002", 28));
            oos.writeObject(LocalDate.of(1992, 7, 15));
            try
            {
                while (true)
                    System.out.println(ois.readObject());
            }
            catch (java.io.EOFException e)
            {
                System.out.println("反序列化结束。");
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

我已经写好一个Person类:

class Person implements java.io.Serializable
{
    /**
     * Auto-generated serial uid
     */
    private static final long serialVersionUID = 2934681400377275017L;
    private String name;
    private String id;
    private transient int age;
    
    public Person()
    {
        this("Anonymous", "00000001", 999);
    }
    
    public Person(String name, String id, int age)
    {
        this.name = name;
        this.id = id;
        this.age = age;
    }
    
    @Override
    public String toString()
    {
        return String.format("[Person %d: name=%s, id=%s, age=%d]", hashCode(), name, id, age);
    }
}

得到运行结果:

[Person 17033014: name=Hippo, id=20190001, age=0]
[Person 21499129: name=Rhino, id=20190002, age=0]
1992-07-15
反序列化结束。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_诗礼_
2014-07-01 · 超过69用户采纳过TA的回答
知道小有建树答主
回答量:184
采纳率:50%
帮助的人:108万
展开全部
不知道你用什么存。加个标志符号?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qingwenxin
2014-07-01
知道答主
回答量:13
采纳率:0%
帮助的人:6万
展开全部
我也没看懂!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式