2013-05-26 69 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