2013-05-26 5 views
-1

У меня есть большая проблема с этим. Моя база данных (clients.txt) выглядит следующим образом:Java - сохранение данных в hashmap

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 

Я просто DataBase класс с частными полями, добытчиками, инкубационных и класс DataBaseHandler, который читает клиентов. 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 и я работает (чтение) по нац при данных в классе 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 

линия. Это проблема с кодировкой? Как решить мою проблему?

ответ

1

Стандартный механизм сериализации Java не создает текст, разделенный точкой с запятой. Он создает немного более сложный двоичный формат. Когда вы попытались открыть файл для добавления (см. Флаг true, который вы отправляете в FileOutputStream), а затем напишите в текстовый файл некоторую двоичную информацию, на которой вы фактически получаете файл, где голова - это текст, а затем появляется двоичная информация. Затем вы открываете файл с помощью текстового редактора. Ему удается интерпретировать некоторую двоичную информацию как вид текста, который вы видите. По этой причине копирование/вставка не работает.

Теперь что делать. Если вы хотите продолжить работу с вашим пользовательским форматом, я бы рекомендовал вам создать класс утилиты, который читает такие строки, разделяет их на поля и создает объекты класса DataBase и записывает метод, который создает строку из вашего экземпляра.

Если вы хотите использовать стандартную сериализацию, просто используйте ее и забудьте о своем формате.

Если вы хотите использовать формат и объединить его с сериализацией, вам нужно настроить механизм сериализации для своего класса. Для этого применяются методы readObject() и writeObject(). Подробнее см. here.

+0

Благодарим за ответ. Это мой первый «большой» проект в java, так что приятно учиться у таких людей, как вы :) – tmq