再次使用该程序时,如何将多个对象写入可序列化文件并读取它们? [英] How do I write multiple objects to the serializable file and read them when the program is used again?

查看:57
本文介绍了再次使用该程序时,如何将多个对象写入可序列化文件并读取它们?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为我的项目维护银行用户数据库.我能够将用户数量保存在一个可序列化的文件中.但是,当我尝试将用户保存到数据库时,它只会向数据库中添加最新的用户.

I want to maintain database of users of a Bank for my project. I am able to save the number of users in one serializable file. But when I try to save the user to database it adds only the latest one to database.

下面是编写对象的代码的偷偷摸摸的峰值:

Below is the sneak peak of code which writes the objects:

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();
                    }
                }
            }

具有写入数据库功能的数据库类:

The database class which has functions to write to database:

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;
        }
    }


}

试图读取数据库的代码:

The code which is trying to read the database:

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);
                }
            }
        }
    }

推荐答案

要写入和读取多个对象,请尝试以下操作

Inorder to write and read multiple objects please try as below

将多个对象写入列表

    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类中存在的方法.对您的代码段采用相同的机制

Here getvalues() is method present in Writeobject class. Follow the same mechanism for your code snippet

这篇关于再次使用该程序时,如何将多个对象写入可序列化文件并读取它们?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆