【问题标题】:Java - saving data to hashmap [closed]Java - 将数据保存到 hashmap [关闭]
【发布时间】:2013-05-26 21:55:35
【问题描述】:

我很难弄清楚这一点。 我的数据库(clients.txt)如下所示:

Tom;Test1;1000000.00;58010168302;63481000-10000090;1111;2000000.00;1000000.00
John;Test2;1000000.00;58010158125;63481000-10000091;2222;2000000.00;1000000.00

从左到右:

 name;surname;balance;pesel;cardNumber;pin;dailyLimit;maxDebit

我有一个简单的带有私有字段、getter、setter 和 DataBaseHandler 类的 DataBase 类,它读取 clients.txt 并制作我的 HashMap:

public static Map<Integer, DataBase> data = new HashMap<Integer, DataBase>();
private static Scanner scanner;

public static void read() {

    try {
        scanner = new Scanner(new FileReader("db/clients.txt"));
        int i = 0;
        while(scanner.hasNextLine()) {
            String[] columnData = scanner.nextLine().split(";");
            data.put(i, new DataBase(columnData[0], 
                                     columnData[1],
                                     columnData[2],
                                     columnData[3], 
                                     columnData[4], 
                                     columnData[5], 
                                     columnData[6], 
                                     columnData[7]));
            i++;
        }

这是客户端-服务器应用程序(ATM 模拟器),所以我在 ATMServer 类中调用 read() 函数,并在 ATMProtocol 类(扩展 DataBaseHandler)中操作(读取)该数据。我的问题在哪里?在制作支付功能。我想简单地更改余额的值或使用新的余额创建全新的行并删除旧的并将其保存到 clients.txt 文件中。我读过关于序列化的文章,所以我做了那个函数:

private String payment(String frameNum,
                       String cardNum,
                       String pinNum,
                       String amount) {
    /* something less important
    String answer = null;
    double localAmount = Double.parseDouble(amount);
    double newAmount = 0;

    for(int i = 0; i < data.size(); i++) {
        if(cardNum.equals(data.get(i).getCardNumber())
                && pinNum.equals(data.get(i).getPin())
                && checkAmount(localAmount, i)) {

            newAmount = Double.parseDouble(data.get(i).getBalance()) - localAmount;
            String newAmountString = String.valueOf(newAmount); */
            DataBase dbBase = new DataBase(data.get(i).getName(),
                                            data.get(i).getSurname(),
                                            newAmountString,
                                            data.get(i).getPesel(),
                                            data.get(i).getCardNumber(),
                                            data.get(i).getPin(),
                                            data.get(i).getDailyLimit(),
                                            data.get(i).getMaxDebit());

            try {
                FileOutputStream fileOut = new FileOutputStream("db/clients.txt",true);

                ObjectOutputStream out = new ObjectOutputStream(fileOut);

                out.writeObject(dbBase);
                out.close();
                fileOut.close();

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

运行这个应用之后clients.txt看起来是这样的:

Tom;Test1;1000000.00;58010168302;63481000-10000090;1111;2000000.00;1000000.00
John;Test2;1000000.00;58010158125;63481000-10000091;2222;2000000.00;1000000.00
cardNumberq
dailyLimitq
2000000.00t
1000000.00t

最令人惊讶的是,当我复制最后四行并按 ctrl+v 时,它只会粘贴

cardNumberq

线。是不是编码有问题?如何解决我的问题?

【问题讨论】:

    标签: java serialization hashmap save


    【解决方案1】:

    标准 Java 序列化机制不会产生分号分隔的文本。它会产生更复杂的二进制格式。当您尝试打开文件进行附加时(请参阅发送给FileOutputStreamtrue 标志),然后将一些二进制信息写入您的文本文件,您实际上会得到文件头是文本的文件,然后出现一些二进制信息。然后使用文本编辑器打开文件。它设法将一些二进制信息解释为您看到的一种文本。这就是复制/粘贴不起作用的原因。

    现在该怎么办。如果您想继续使用您的自定义格式,我建议您创建实用程序类来读取此类字符串,将它们分成字段并创建类DataBase 的实例并编写从您的实例创建字符串的方法。

    如果您想使用标准序列化,只需使用它并忘记您的格式。

    如果您想使用格式并将其与序列化相结合,您必须为您的类自定义序列化机制。为此,实现方法readObject()writeObject()。详情请阅读here

    【讨论】:

    • 感谢您的回答。这是我在 java 中的第一个“大”项目,所以很高兴向像你这样的人学习:)
    猜你喜欢
    • 2014-10-15
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2015-11-18
    相关资源
    最近更新 更多