Как добавить объекты в файл данных? - PullRequest
0 голосов
/ 20 мая 2019

В качестве предисловия я уже создал и использовал подкласс, который переопределяет метод writeStreamHeader() в ObjectOutputStream.Я должен подчеркнуть это, поскольку каждая другая проблема, которая задала этот вопрос, похоже, имеет это в качестве решения.

Каждый раз, когда в файл данных записывается более одного объекта, он выдает ошибку StreamCorruptedException: invalid type code: AC.

Вот что у меня есть на данный момент:

public class DataWriter {

        public static void createStats(Stats s) {

            File stats = new File("stats.dat");
            ObjectOutputStream statsOos = null;

            try {
                 boolean isNew = false;

                if(!stats.exists()) {
                    stats.createNewFile();
                    isNew = true;
                }

                 FileOutputStream fos = new FileOutputStream(stats, true);

                if(isNew) {
                    statsOos = new ObjectOutputStream(fos);
                } else {
                    System.out.println("Append");
                    statsOos = new AppendableObjectOutputStream(new ObjectOutputStream(fos));
                }

                if(s != null) {
                    statsOos.writeObject(s);
                    statsOos.flush();
                    statsOos.close();
                }

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

    }

    public class DataReader {

        public static ArrayList<Stats> readStats() {
            File stats = new File("stats.dat");
            if (stats.exists()) {
                ArrayList<Stats> stat = new ArrayList<Stats>();
                try {

                    FileInputStream fis = new FileInputStream(stats);
                    ObjectInputStream ois = new ObjectInputStream(fis);
                    Object obj = null;
                    while((obj=ois.readObject()) != EOFException.class) {
                        if (obj instanceof Stats) {
                            stat.add((Stats)obj);
                        }
                    }
                    ois.close();


                } catch (FileNotFoundException e) {
                    e.printStackTrace();

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

                return(stat);
            } else {
                DataWriter.createStats(new Stats());
                return readStats();
            }
    }

    public class AppendableObjectOutputStream extends ObjectOutputStream {

        public AppendableObjectOutputStream(OutputStream out) throws IOException {
            super(out);
        }

        @Override
        protected void writeStreamHeader() throws IOException {
            reset();
        }

    }

Я не могу найти причину ошибки во всех исследованиях, которые я провел по этой теме.Любая помощь будет принята с благодарностью.

...