怎么用循环的方法来实现 对象序列化的 写入或读取?

怎么用循环的方法来实现 对象序列化的 写入或读取?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.imooc.io;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class ProductTest {
 
    public static void main(String[] args) throws ClassNotFoundException {
        // TODO Auto-generated method stub
        FileOutputStream fos;
        FileInputStream fis;
        ObjectOutputStream oos;
        ObjectInputStream ois;
         
        Product iphone=new Product(123,"iphone","telephone",4888.0);
        Product ipad=new Product(234,"ipad","computer",5088.0);
        Product macbook=new Product(345,"macbook","computer",10688.0);
        Product iwatch=new Product(256,"iwatch","telephone",4799.0);
         
         
         
        try {
            fos=new FileOutputStream("test.txt");
            oos=new ObjectOutputStream(fos);
            oos.writeObject(iphone);//逐个写入,可否有其他方法?
            oos.writeObject(ipad);
            oos.writeObject(macbook);
            oos.writeObject(iwatch);
            oos.flush();
            fos.close();
            oos.close();
            fis=new FileInputStream("test.txt");
            ois=new ObjectInputStream(fis);
            System.out.println("Apple系列产品信息:");
            System.out.println((Product)(ois.readObject()));//一个一个地读取,有没有其他办法?
            System.out.println((Product)(ois.readObject()));
            System.out.println((Product)(ois.readObject()));
            System.out.println((Product)(ois.readObject()));
             
        catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
}

大家好,如上代码,可以实现5-1的练习题要求,但也让我提出了一个疑问,有没有办法像读取字节或字符一样,使用循环的方法实现读写呢? 尝试了 当ois.readObject()!=null时进行读取,可以成功读取,但最后会抛出异常,求高人指教,谢谢了.

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

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

1回答
irista23 2018-03-10 21:33:25

可以使用如下代码实现循环读取:

1
2
3
while ((n = fis.read(b)) != -1){
……
}

其中b是byte数组,n是返回读入缓冲的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回-1。循环里n一直在变,到最后读取完了inputstream,n=-1,跳出while。n是循环的判断条件。


  • 提问者 Alan阿浩 #1
    您好, 这样子一般是用来读取文本或者,读取到流中吧,如果用来读取对象,具体要怎么操作呢,要在while循环中写什么代码呢?麻烦指教,谢谢了.
    2018-03-10 23:10:09
  • irista23 回复 提问者 Alan阿浩 #2
    如果你想将多个对象保存到一个文件中并且能把所有对象都读取出来,那就必须使用一种数据结构把这些对象存入,比如对象数组,并且保证存入和读取时结构一样。使用inputStream.readObject();返回对象数组,之后就可以使用循环遍历这个对象数组了。
    2018-03-11 10:20:05
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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