为什么会报错呢?

为什么会报错呢?

System.out.println(ois.readInt());

把这条语句注释后就会报错,这是为什么啊?

# 报错信息的截图
http://img1.sycdn.imooc.com//climg/5fdcb4d309ec267a09010235.jpg

import java.io.*;

public class Product implements Serializable {
private String id;
private String name;
private String categories;
private Float price;

public Product(){

}

public Product(String id, String name, String categories, Float price) {
this.id = id;
this.name = name;
this.categories = categories;
this.price = price;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCategories() {
return categories;
}

public void setCategories(String categories) {
this.categories = categories;
}

public Float getPrice() {
return price;
}

public void setPrice(Float price) {
this.price = price;
}

@Override
public String toString() {
return "Product{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", categories='" + categories + '\'' +
", price=" + price +
'}';
}

public static void main(String[] args) {
Product product = new Product("256", "iwatch", "watch", 4799f);
try {
FileOutputStream fos = new FileOutputStream("C:\\Users\\wmj\\Desktop\\test\\1\\1.txt");
FileInputStream fis = new FileInputStream("C:\\Users\\wmj\\Desktop\\test\\1\\1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
ObjectInputStream ois = new ObjectInputStream(fis);
oos.writeInt(123);
oos.writeObject(product);

oos.flush();
// System.out.println(ois.readInt());
Product product1=(Product)ois.readObject();
System.out.println(product1);
ois.close();
oos.close();
fis.close();
fos.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,是的,同学的理解是正确的;但是这里并不是读取后进行删除,而是上面使用ois.readInt()方法读取了一次数据,等再次使用ois.readObject()方法读取时,会进行读取下一个数据;同学也可以向文件中写入int类型的456,再次读取试试

祝学习愉快

  • 谁叫我这么坏 提问者 #1

    程序是怎么记录读取到哪里了呢?是像iterator中的hasnext方法一样有个游标来标记读取的位置吗?

    2020-12-19 11:19:37
  • 同学你好,readInt()方法是读取输入流中的下一个整数,并返回;也就是说调用一次返回一个int类型的数据,再调用返回第二个数据;readObject()方法同理,是调用一次返回一个对象,再调用readObject()一次返回第二个对象,自动在每个数据后面做标记!

    同学现阶段可以先掌握语法结构

    关于底层原理,如果同学感兴趣,等我们的代码量和知识储备量达到一定程度时,再对底层的代码进行深入研究

    祝学习愉快~

    2020-12-19 11:59:15
好帮手慕阿园 2020-12-19 09:53:12

同学你好,因为同学这里在文件中存储了int类型的123,读取时使用readObject()读取基本数据类型就会出现这样的错误,所以同学需要先将123读取出来,然后读取Object类型的数据

祝学习愉快~

  • 提问者 谁叫我这么坏 #1

    序列化中的数据顺序与写入的顺序一致,先写的先读,后写的后读,然后先存储的是int类型数据,如果使用readObject()读取时会从开始读取,这样类型不一致会导致读取错误。是这样的吧?
    那这样依次读取数据的原理是怎么实现的呢?是用readInt()读取后把int类型的数据删除再用readObject()读Object类型的吗?

    2020-12-19 10:43:39
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师