序列化对象被覆盖,未添加到

时间:2014-01-15 00:53:54

标签: java object serialization arraylist

我正在尝试将用户帐户信息存储到一个单独的文本文件中,这是我在多次尝试后完成的...

但是,每次创建新用户时,它都会覆盖放入文件的最后一个用户。 此外,唯一存储的是Strings,我有一个PIN码和帐户余额,以后我需要这些非常重要。

到目前为止,我有这个问题,我认为问题在于每次运行代码时都会创建一个Object命名用户,并且因为它不是动态的,所以每次都会覆盖它自己。

如果你能用最简单的术语来解释这个问题,那么我就是序列化任何东西的菜鸟了!

我的目标是能够存储每个新用户帐户,如果帐户信息与密码和用户名匹配,则稍后再返回给用户显示

public class ATM implements Serializable {

public static void main(String[] args) {

    // variables
    String dash = "-------------------\n";
    int accounts = 0;

    // Scanner
    Scanner scanner = new Scanner(System.in);

    // Welcome screen
    System.out.print(dash);
    System.out.print("Welcome to the Bank\n");
    System.out.print(dash);

    System.out.println("Do you have an account with us? (y/n) ");

    String answer = scanner.nextLine();

    if (answer.equalsIgnoreCase("y")) {

    } else {

        // new user is created
        Bank bank = new Bank();

        accounts++;

        System.out
                .println("Enter your full name below (e.g. John M. Smith): ");
        String name = scanner.nextLine();
        System.out.println("Create a username: ");
        String userName = scanner.nextLine();
        System.out.println("Enter your starting deposit amount: ");
        int balance = scanner.nextInt();

        System.out.print(dash);
        System.out.print("Generating your information...\n");
        System.out.print(dash);

        int pin = bank.PIN();
        String accountNum = bank.accountNum();

        String id = name + accountNum;

        User user = new User(name, userName, pin, accountNum, balance);

        // new user gets added to the array list
        Bank.users.add(user);

        String test = "Test989898998";

        System.out.println(user);

        try {
            FileOutputStream fileOut = new FileOutputStream("users.txt");

            ObjectOutputStream out = new ObjectOutputStream(fileOut);

            out.writeObject(Bank.users);
            out.close();
            fileOut.close();

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

}

}

银行等级

public class Bank implements Serializable {

//Generate a random 16 digit bank account number
public String accountNum() {

    int max = 9999;
    int min = 1000;

    int a1 = (int) (Math.random() * (max - min) + min);
    int a2 = (int) (Math.random() * (max - min) + min);
    int a3 = (int) (Math.random() * (max - min) + min);
    int a4 = (int) (Math.random() * (max - min) + min);

    String accountNum = a1 + "-" + a2 + "-" + a3 + "-" + a4;

    return accountNum;
}

//Generate a random 4 digit PIN
public int PIN() {

    int max = 9999;
    int min = 1000;

    int PIN = (int) (Math.random() * (max - min) + min);

    return PIN;
}

//array list for users
static ArrayList<User> users = new ArrayList<User>() {

};

}

用户类

public class User implements Serializable{

String name;
String userName;
String accountNum;
int pin;
int balance;

public User (String name, String userName, int pin, String accountNum, int balance) {

    this.name = name;
    this.userName = userName;
    this.accountNum = accountNum;
    this.pin = pin;
    this.balance = balance;
}

public String toString() {

    return "Name: " + this.name + "\n\nUsername: " + this.userName + " | " + "Pin: " + this.pin + "\n\n"
             + "Account Number: " + this.accountNum + "\n\nAccount Balance: $" + this.balance + 
            "\n\nNever share your login information with anyone!";
}

}

1 个答案:

答案 0 :(得分:1)

  

但是,每次创建新用户时,它都会覆盖放入文件的最后一个用户。

这是对的。您没有附加到该文件,而是创建一个新文件。这与对象或序列化无关,只是你正在使用FileOutputStream的构造函数。

但是,没有使用我在这里不会引用的技巧,你不能附加到对象流,因为有一个标题会混淆后续的读者。您需要读入整个文件并再次写出来。最简单的方法是序列化ArrayList<User>而不是User对象本身。

相关问题