读取数据时默认是不能以null作为文件读取结束的标志的,可以用什么标志?

读取数据时默认是不能以null作为文件读取结束的标志的,可以用什么标志?

运行时异常

package com.yito.product;

import java.io.Serializable;

public class Product implements Serializable {

    private String id;//商品编号
    private String name;//商品名称
    private String categories;//商品属性
    private double price;//商品价格

    //构造方法
    public Product(){

    }
    public Product(String id, String name, String categories, double price){
        this.setId(id);
        this.setName(name);
        this.setCategories(categories);
        this.setPrice(price);
    }

    //set/get
    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 double getPrice() {
        return price;
    }

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

    //toString

    @Override
    public String toString() {
        return "产品ID:"+this.getId()+'\n'
            +"产品名称:"+this.getName()+'\n'
            +"产品属性:"+this.getCategories()+'\n'
            +"产品价格:"+this.getPrice();
    }
}
package com.yito.product;

import java.io.*;

public class Test {
    public static void main(String[] args) {
        //实现化商品对象并赋值
        Product iphone = new Product("123", "iphone","telephone",4888);
        Product ipad = new Product("234","ipad","computer",5088);
        Product macbook = new Product("345","macbook","computer",10688);
        Product iwatch = new Product("256","iwatch","watch",4799);

        try {
            //创建对象输入输出流
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Product.txt"));
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Product.txt"));

            //将对象信息写入文件
            oos.writeObject(iphone);
            oos.writeObject(ipad);
            oos.writeObject(macbook);
            oos.writeObject(iwatch);
            oos.flush();

            //读取对象信息
            System.out.println("apple系列产品信息:");
            Product product =null;
            while (( product = (Product) ois.readObject())!=null) {
                System.out.println(product);
                System.out.println();
            }

            oos.close();
            ois.close();


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

    }
}


正在回答 回答被采纳积分+1

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

1回答
好帮手慕阿慧 2020-03-15 15:36:12

同学你好, 我们可以手动在最后写入了一个结束标志 null,这样就可以通过null判断文件是否结束了。

代码修改为:

http://img1.sycdn.imooc.com//climg/5e6ddae3090b37d305830197.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 Michael_2020 #1
    还有其他的方式判断读取结束吗?
    2020-03-15 15:37:03
  • 好帮手慕阿慧 回复 提问者 Michael_2020 #2
    同学你好,我们可以1、创建一个集合如List集合,往集合中添加多个Product对象。2、将集合写入文件:oos.writeObject(list);。3、读取:List<Product> list2=(List<Product>) ois.readObject(),然后遍历list2就可以了,就不存在判空问题了。
    2020-03-15 16:35:37
  • 提问者 Michael_2020 回复 好帮手慕阿慧 #3
    老师好!麻烦帮我看一下这样改写对吗? 为什么添加的时侯是ArrayList, 而后面读取的时候就是List,这里还不太明白,请赐教。 我在回答区贴了代码,麻烦老师看一下。
    2020-03-16 16:26:55
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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