2013-05-26 53 views
-1

我对解决这个问题有很大的困扰。 我的数据库(clients.txt)看起来是这样的:Java - 将数据保存到散列图

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和数据库处理器类,它读取客户数据库类。 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类,我工作(读)在th在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 

什么是最supprising的是,当我复制后四排并按ctrl + v它只会粘贴

cardNumberq 

line。编码有问题吗?如何解决我的问题?

回答

1

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

现在该怎么做。如果你想继续使用你的自定义格式,我建议你创建一个工具类,读取这样的字符串,将它们分离到字段中,并创建类DataBase的instnaces,并编写从您的实例创建字符串的方法。

如果你想使用标准的序列化只是使用它,忘记你的格式。

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

+0

谢谢你的回答。这是我在java中的第一个“大”项目,所以很高兴向你这样的人学习:) – tmq