web-dev-qa-db-ja.com

プログラムを再度使用するときに、複数のオブジェクトをシリアル化可能なファイルに書き込み、それらを読み取るにはどうすればよいですか?

私のプロジェクトでは、銀行のユーザーのデータベースを維持したいと考えています。ユーザー数を1つのシリアル化可能なファイルに保存できます。しかし、ユーザーをデータベースに保存しようとすると、最新のユーザーのみがデータベースに追加されます。

以下は、オブジェクトを書き込むコードのこっそりしたピークです。

if(e.getSource()==submit) {
            if(uFName != null && uLName != null && uInitialDeposit !=0) {
                if(uAccountType=="Savings") {
                    Random randomGenerator = new Random();
                    //Gets the number of users from file if file exists
                    File f = new File(fileNameAdmin);
                    if(f.exists() && !f.isDirectory()) {
                        admin=db.readFromAdminDatabase();
                    }
                    u[admin.numberOfUsers]= new User();
                    u[admin.numberOfUsers].fName=uFName;
                    u[admin.numberOfUsers].lName=uLName;
                    u[admin.numberOfUsers].initalDeposit=uInitialDeposit;
                    u[admin.numberOfUsers].interestRate=uInterestRate;
                    u[admin.numberOfUsers].accountType="Saving";
                    u[admin.numberOfUsers].accountNumber=690000+admin.numberOfSavingsAccount;

                    //Generates a 4 digit random number which will be used as ATM pin
                    u[admin.numberOfUsers].atmPin=randomGenerator.nextInt(9999-1000)+1000;

                    //A savings account will be created 
                    sa[admin.numberOfSavingsAccount]=new SavingsAccount(u[admin.numberOfUsers].accountNumber,u[admin.numberOfUsers].fName,u[admin.numberOfUsers].lName,
                            u[admin.numberOfUsers].initalDeposit,
                            u[admin.numberOfUsers].interestRate);
                    u[admin.numberOfUsers].sa=sa[admin.numberOfSavingsAccount];
                    System.out.println(u[admin.numberOfUsers].sa.balance);
                    JOptionPane.showMessageDialog(submit,"Congratulations! You are now a member of Symbiosis Bank."
                            + "\nYour account number is "+u[admin.numberOfUsers].accountNumber
                            +" and your ATM Pin is "+u[admin.numberOfUsers].atmPin,"Account Created",JOptionPane.INFORMATION_MESSAGE);
                    try {

                        //for(int j = 0; j<admin.numberOfUsers; j++)

                        db.addUserToDatabase(u[admin.numberOfUsers]);
                        admin.numberOfSavingsAccount++;
                        admin.numberOfUsers++;
                        db.updateAdminDatabase(admin);
                        dispose();
                        setVisible(false);
                        //Welcome welcome = new Welcome();
                        //welcome.setVisible(true);
                        InitialInput back = new InitialInput();
                        back.setVisible(true);

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

データベースに書き込む機能を持つデータベースクラス:

import Java.io.FileInputStream;
import Java.io.FileOutputStream;
import Java.io.ObjectInputStream;
import Java.io.ObjectOutputStream;
import Java.io.Serializable;

public class Database implements Serializable {
    String fileName = System.getProperty("user.home")+"/db.ser";
    String fileNameAdmin = System.getProperty("user.home")+"/admindb.ser";
    public void addUserToDatabase(User u){

        FileOutputStream fos;
        try {
            fos = new FileOutputStream(fileName);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(u);
            oos.close();
            }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
    @SuppressWarnings("finally")
    public User readFromUserDatabase() {
        FileInputStream fis;
        User temp = null;
        try {
            fis = new FileInputStream(fileName);
            ObjectInputStream ois = new ObjectInputStream(fis);
            temp = (User)ois.readObject();
            //System.out.println(temp.fName);
            ois.close();

        }
        catch(Exception e) {
            e.printStackTrace();
        }
        finally {
            return temp;
        }
    }

    public void updateAdminDatabase(Administrator admin) {
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(fileNameAdmin);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(admin);
                oos.close();
                }
            catch(Exception e) {
                e.printStackTrace();
            }
    }
    @SuppressWarnings("finally")
    public Administrator readFromAdminDatabase() {
        FileInputStream fis;
        Administrator temp = null;
        try {
            fis = new FileInputStream(fileNameAdmin);
            ObjectInputStream ois = new ObjectInputStream(fis);
            temp = (Administrator)ois.readObject();
            //System.out.println(temp.fName);
            ois.close();

        }
        catch(Exception e) {
            e.printStackTrace();
        }
        finally {
            return temp;
        }
    }


}

データベースを読み取ろうとしているコード:

public void actionPerformed(ActionEvent e) {
if(e.getSource()==deposit) {
    //Ask the amount to deposit
    int userAmountToDeposit;
    try {
        for(int i = 0; i<=admin.numberOfUsers; i++) {
            u[i] = db.readFromUserDatabase();
            System.out.println(u[i].accountNumber);

        }
        for(int j =0; j<=admin.numberOfUsers; j++) {
            if(u[j].accountNumber==userAccountNumber) {
                if(u[j].atmPin==userPin) {
                u[j].accountBalance=u[j].sa.balance;
                u[j].sa.deposit(10);
                u[j].accountBalance=u[j].sa.balance;
                System.out.println(u[j].accountBalance);
                }
            }
        }
    }
12
Udit Chugh

複数のオブジェクトを読み書きするには、以下のように試してください

複数のオブジェクトをリストに書き込む

    WriteObject wo=new WriteObject(20, "Mohan");
    WriteObject wo1=new WriteObject(21, "Mohanraj");

    ArrayList<WriteObject> woi=new ArrayList<>();
    try {
        FileOutputStream fop=new FileOutputStream("c://object.ser");
        ObjectOutputStream oos=new ObjectOutputStream(fop);
        woi.add(wo);
        woi.add(wo1);
        oos.writeObject(woi);

    } catch NotFoundException e) {
}

ファイルからすべてのオブジェクトを読み取る

 try {
        FileInputStream fis=new FileInputStream("C://object.ser");
        ObjectInputStream ois=new ObjectInputStream(fis);
        WriteObject wo=null;
        WriteObject[] woj=new WriteObject[5];

        ArrayList<WriteObject> woi=new ArrayList<>();
        woi=(ArrayList<WriteObject>)ois.readObject();

        for(int i=0;i<woi.size();i++){
            woi.get(i).getvalues();
        }

ここでgetvalues()はWriteobjectクラスに存在するメソッドです。コードスニペットについても同じメカニズムに従います

16
Mohan Raj

すばやく修正したい場合は、リストを作成して、まずオブジェクトをリスト(ArrayListまたはList)に格納してから、このリストをファイルに保存します。それがいい方法です。オブジェクトがシリアライズ可能であることを確認してください。

以下のlisteVoituresは、ファイルから取得するすべてのオブジェクトを含む戦術変数です。

public static void saveVehiculeInFile(ArrayList vehiculeList){

    ObjectOutputStream ous = null;
    //ArrayList<Vehicule> listVehiculeToSave = new ArrayList<>();

    try {
        ous = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File("garage.txt"))));

            try {

                ous.writeObject(vehiculeList);
                System.out.println("\t=====> Les vehicules *** ont été ajouter dans le garage.");

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }       

    } catch (FileNotFoundException e) {

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

        e.printStackTrace();
    } finally {

        if (ous != null) {
            try {
                ous.close();
            } catch (IOException e) {

                e.printStackTrace();
            }
        }
    }


}

以下のこのメソッドは、ファイルからデータを取得するためのものです

public static void readVehiculeFromFile() {

    ObjectInputStream ins = null;
    ArrayList<Vehicule>  v = null;

    try {
        ins = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File("PoweredGarage.txt"))));

        try {
            v = (ArrayList<Vehicule>)ins.readObject();

        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

            for (Vehicule vehicule : v) {
                listeVoitures.add(vehicule);
            }


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally {
        if (ins != null) {
            try {
                ins.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
1
Blue Like