Java没有从文件中读取所有对象

标签 java object 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;

    }

}   

最佳答案

这就是问题:

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

每次迭代都会调用 readObject() 两次。除了检查第一次调用的结果是否为空之外,将忽略第一次调用的结果。你只想要这样的东西:

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

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

关于Java没有从文件中读取所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53207977/

相关文章:

java - 为什么我们要在类中声明接口(interface)?

java - 如何操作数组列表 - 计算机科学作业

java - 执行ArrayList中的命令

javascript - 如何在 React 中替换对象数组的值

java - Arraylist.remove(index) 方法的效率?

java - Spring-ActiveMQ : DefaultMessageListenerContainer not getting destroyed

java - 错误: package android. util不存在

java - 如何确保异常不会丢失java中的堆栈跟踪信息?

java - 如何使用 Google Guava 字典按对象字段迭代对象列表?

javascript - 删除操作符 - 行为很奇怪