Java не читает весь объект из файла - PullRequest
0 голосов
/ 08 ноября 2018

Итак, у меня есть очень странная ошибка, я помещаю свои объекты в массив, выписываю их, чтобы увидеть, все ли там, все проверено, я записываю их в файл, все есть, когда я открываю файл, но когда я продолжаю читать их, некоторые объекты по неизвестным причинам не читаются, например, эта запись не существует в файле, но я вижу в файле, что они там есть. Кто-нибудь знает, что я здесь скучаю?

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 голосов
/ 08 ноября 2018

Это проблема:

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

Это вызывает readObject() дважды за итерацию. Результат первого вызова игнорируется, кроме проверки, является ли он нулевым. Вы просто хотите что-то вроде:

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

Вам не нужна переменная cond, и теперь вы вызываете readObject только один раз за итерацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...