Добавление Java-сериализованных объектов

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

Вот мой код:

import java.io.BufferedInputStream;
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.Scanner;




public class Working {

     String FILENAME = "E:\\assignment\\userpass\\userpass.txt";

    Scanner sc = new Scanner(System.in);
    String sUser = null, sPass = null, sRole = null;

    Signup signup = new Signup();

    public void createUser(){

        System.out.println(" Enter username: ");
        sUser = sc.next();

        System.out.println(" Enter password: ");
        sPass = sc.next();

        System.out.println(" Enter Role: ");
        sRole = sc.next();


        Working obj = new Working();

        signup.setUsername(sUser);
        signup.setPassword(sPass);
        signup.setRole(sRole);

        obj.serializeUser(signup);


    }





public void serializeUser(Signup signup){

        FileOutputStream fout = null;
        ObjectOutputStream oout= null;

        File file = new File(FILENAME);

        try{

        //  fout = new FileOutputStream(file);
        //  fout = new FileOutputStream(file.getAbsoluteFile(), true);
            fout = new FileOutputStream(file, true);
        //  fout = new FileOutputStream(FILENAME);
            oout = new ObjectOutputStream(fout);
            oout.writeObject(signup);

            System.out.println("User has been serialized");

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

        } finally {

            if(fout != null){
                try{

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

            if(oout != null){
                try{

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

        }

    }


// for test purpose
public void showUsers(){
    Working obj = new Working();
    Signup add = obj.deserializeUser(FILENAME);

    System.out.println(add);
}

// to show data
//test purpose

public Signup deserializeUser(String filename){

    Signup userDetails = null;
    File file = new File(FILENAME);

    FileInputStream fin = null;
    ObjectInputStream oin = null;

    try{

        fin = new FileInputStream(file);
        oin = new ObjectInputStream(fin);

        userDetails = (Signup) oin.readObject();

    } catch(Exception ex){
        ex.printStackTrace();
    } finally{
        if (fin != null) {
            try {
                fin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (oin != null) {
            try {
                oin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return userDetails;

}

}

Я уже проверил здесь: 1. http://www.enseignement.polytechnique.fr/informatique/Java/1.8/java/io/FileOutputStream.html2. Присоединение к ObjectOutputStream

1 ответ

Вам нужно создать новый Signup объект каждый раз вокруг цикла, или вызов ObjectOutputStream.reset() каждый раз, или используйте ObjectOutputStream.writeUnshared(),

Однако есть и другие проблемы.

  • Вы должны закрыть поток вывода объекта перед потоком вывода файла или вместо.
  • Вы не можете добавить к выходному потоку объекта, по крайней мере, не так просто, как это. Смотрите мой ответ о 'StreamCorruptedException - неверный код типа AC', почему бы и нет. Вы должны использовать технику в вашей второй ссылке.
Другие вопросы по тегам