Java 怎样将多个对象读取出来,怎样判断是否读完?
我在文件中存入了多个对象,怎样在读取时判断是否读完,我用捕获异常方法,他只能读取第一个对象,就会抛java.io.StreamCorruptedException:inv...
我在文件中存入了多个对象,怎样在读取时判断是否读完,我用捕获异常方法,他只能读取第一个对象,就会抛java.io.StreamCorruptedException: invalid type code: AC,求大神!!
我是在circle类中写了给将当前对象存到文件的方法,在测试类中直接调用追加到文件尾 展开
我是在circle类中写了给将当前对象存到文件的方法,在测试类中直接调用追加到文件尾 展开
6个回答
推荐于2017-11-29 · 知道合伙人数码行家
关注
展开全部
您好,提问者:
将对象存入文件中?是用的序列化吧?
如果确实报错,下面我写的一个例子,你可以看一下。
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;
}
}
展开全部
你的文件是分多次写入的吧?
java在写对象进文件时,每次写入都会先写一个header,再写对象本身的。
但是读取时只在第一次时才读取header,后面都直接读对象。
如果你多次写入同一个文件,但是读取是一次性读取,就会引起这个问题。
举个例子,如果你是一次性写入文件的,那么文件结构是:
header,obj,obj,obj。。。
多次写入则是
header,obj,header,obj。。。
而你读取是一次性的,是这样读的
header,obj,obj,obj。。。
你用追加方式写入的,就是多次写入的情况,所以会出错
java在写对象进文件时,每次写入都会先写一个header,再写对象本身的。
但是读取时只在第一次时才读取header,后面都直接读对象。
如果你多次写入同一个文件,但是读取是一次性读取,就会引起这个问题。
举个例子,如果你是一次性写入文件的,那么文件结构是:
header,obj,obj,obj。。。
多次写入则是
header,obj,header,obj。。。
而你读取是一次性的,是这样读的
header,obj,obj,obj。。。
你用追加方式写入的,就是多次写入的情况,所以会出错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
序列化读完之后到达文件尾,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
反序列化结束。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你用什么存。加个标志符号?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询