Java - Как заставить ObjectInputStream читать все объекты из файла - PullRequest
0 голосов
/ 13 октября 2018
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Scanner;
public class FileDemo implements Serializable
{
    static ArrayList<FileDemo> list=new ArrayList<FileDemo>();

    public static void main(String[] args) throws Exception 
    {
        File file=new File("log.txt");
        if(!file.createNewFile() && file.length()!=0)
        {
            FileInputStream fis=new FileInputStream("log.txt");
            ObjectInputStream ois=new ObjectInputStream(fis);
            while(true)
            {
                try{
                    list.add((FileDemo)ois.readObject());                   
                }
                catch(EOFException e) {
                    break;
                }
                catch(Exception e) {
                    e.printStackTrace();
                    break;
                }
            }
            ois.close();
            fis.close();
        }
        Scanner scn=new Scanner(System.in);
        int x=0;
        while(x!=3)
        {
            System.out.println("MENU");
            System.out.println("Enter 1 to add new object to file");
            System.out.println("Enter 2 to display list size");
            System.out.println("Enter 3 to exit");
            System.out.print("Enter your choice: ");
            x=scn.nextInt();
            if(x==1)
            {
                FileDemo filedemo=new FileDemo();
                list.add(filedemo);
                FileOutputStream fos=new FileOutputStream("log.txt",true);
                ObjectOutputStream oos=new ObjectOutputStream(fos);
                oos.writeObject(filedemo);
                oos.close();
                fos.close();
                System.out.println("Object Created");
            }
            else if(x==2)
                {
                    System.out.println(list.size());
                }
            else if(x==3)
                break;
            else
                System.out.println("Invaild choice");
        }
    }
}

Привет, В этой программе каждый раз, когда пользователь вводит опцию 1 в меню, создается новый объект класса, сохраняется в списке и также сохраняется в файле.Когда я пытаюсь прочитать объекты из файла при следующем выполнении программы, он читает только первый объект из файла, и при следующем вызове readObject () это вызывает исключение следующим образом:

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at FileDemo.main(FileDemo.java:25)

Я хотел бы знать, как я могу прочитать все объекты, хранящиеся в файле, и добавить их в список.

Спасибо, Клемент

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

проверьте этот вопрос

Более того, вы должны проверить, как обращаться с ресурсами в Java, например, здесь .

Если вы хотитесохранить объект за объектом в .txt файле, вы можете использовать JSON-анализатор (например, jackson )

0 голосов
/ 13 октября 2018

ObjectOutputStream предназначен для записи в поток только один раз.Он не предназначен для добавления.Самое простое решение - создать List и записать этот список в файл.Альтернативой является создание собственного протокола, оборачивающего поток вывода объекта, хотя это может быть более сложным.

Короче говоря, если вы хотите добавить элемент, вам нужно прочитать, где он был, добавить элемент вперечислить и заменить / перезаписать файл.

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

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

import java.io.*;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class FileDemo implements Serializable {
    static class FileList implements Serializable {
        List<FileData> list = new ArrayList<>();
    }

    static class FileData implements Serializable { }

    public static void main(String[] args) throws IOException {
        File file = new File("log.data");
        FileList list = new FileList();
        if (file.exists()) {
            try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
                list = (FileList) ois.readObject();
            }
        }
        Scanner scn = new Scanner(System.in);
        while (true) {
            System.out.print("MENU\n" +
                    "Enter 1 to add new object to file\n" +
                    "Enter 2 to display list size\n" +
                    "Enter 3 to exit\n" +
                    "Enter your choice: ");
            int option = scn.nextInt();
            switch (option) {
                case 1:
                    list.list.add(new FileData());
                    File tmp = new File("log.data.tmp");
                    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(tmp))) {
                        oos.writeObject(list);
                    }
                    Files.move(tmp.toPath(), file.toPath(), REPLACE_EXISTING);
                    System.out.println("Object Added");
                    break;
                case 2:
                    System.out.println(list.list.size());
                    break;
                case 3:
                    return;
                default:
                    System.out.println("Invalid choice");
                    break;
            }
        }
    }
}
...