Java不从文件读取所有对象

时间:2018-11-08 12:42:43

标签: java object arraylist

所以我有一个真正的奇怪错误,我将我的对象放到arraylist中,写出它们看是否一切都存在,一切都签出了,我将它们写下到文件中,打开文件时有一切,但是当我继续读取它们时,某些对象由于未知原因而无法读取,例如该条目在文件中不存在,但我可以在文件中看到它们在那里。有人知道我在这里想念吗?

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class ReadWriteTD {

    public static void write(ArrayList<Tokendata> list) {
        try {
            FileOutputStream f = new FileOutputStream(new File("src/resources/TokenProfiles"));
            ObjectOutputStream o = new ObjectOutputStream(f);

            // Write objects to file

            list.forEach(a -> {
                try {
                    o.writeObject(a);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            });


            o.close();
            f.close();



        } catch (FileNotFoundException e) {
            System.out.println("File not found");
        } catch (IOException e) {
            System.out.println("Error initializing stream");
        }

    }


    public static ArrayList<Tokendata> read() {
        ArrayList<Tokendata> list = new ArrayList<Tokendata>();

        try {

            FileInputStream fi = new FileInputStream(new File("src/resources/TokenProfiles"));
            ObjectInputStream oi = new ObjectInputStream(fi);           

            Boolean cond = true;
            while(cond){
                if(oi.readObject() != null) 
                    list.add((Tokendata) oi.readObject());
                else cond=false;
            }

            oi.close();
            fi.close();

    }catch(Exception e){

    }
    //list.forEach(a -> System.out.print(a.toString()));
        return list;

    }

}   

1 个答案:

答案 0 :(得分:8)

这是问题所在

if(oi.readObject() != null)
   list.add((Tokendata) oi.readObject());

每个迭代调用readObject()两次。第一次调用的结果将被忽略,除了检查其是否为空。您只想要以下内容:

Object obj;
while ((obj = oi.readObject()) != null) {
    list.add((Tokendata) obj);
}

不需要cond变量,现在每次迭代只调用一次readObject