2013-05-26 5 views
-1

나는 이것을 알아 내는데 큰 문제가있다. (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 

나는 개인 필드, 게터, 세터와 클라이언트를 읽어 DataBaseHandler 클래스와 단순히 데이터베이스 클래스가 있습니다. ATMServer 클래스에이 클라이언트 - 서버 응용 프로그램 (ATM의 시뮬레이터), 그래서 (읽기 전화 드렸습니다됩니다

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++; 
     } 

) 기능과 나는 일에 (읽기) 운영 해요 : TXT 및 내의 HashMap한다 ATMProtocol 클래스의 데이터 (DataBaseHandler를 확장) 내 문제는 어디에 있습니까? 지불 기능을 만들기. 간단히 균형의 가치를 바꾸거나 새로운 금액의 새로운 줄을 만들고 오래된 것을 삭제하고이를 clients.txt 파일에 저장하고 싶습니다. 내가 그 기능을했습니다, 그래서 나는 직렬화에 대해 읽었습니다 :이 응용 프로그램의 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(); 
      } 

은 다음과 같습니다

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 것은입니다 나는 마지막 4 개 행을 복사 할 때 Ctrl + V를 누르면 붙습니다.

cardNumberq 

행. 인코딩에 문제가 있습니까? 내 문제를 해결하는 방법?

답변

1

표준 Java 직렬화 메커니즘은 세미콜론으로 구분 된 텍스트를 생성하지 않습니다. 조금 더 복잡한 바이너리 형식을 생성합니다. 추가 파일 (FileOutputStream으로 보내는 true 플래그 참조)을 열려고 시도하고 텍스트 파일에 몇 가지 이진 정보를 쓰려고하면 실제로 머리가 텍스트 인 파일을 얻은 다음 일부 이진 정보가 나타납니다. 그런 다음 텍스트 편집기를 사용하여 파일을 엽니 다. 몇몇 이진 정보를 당신이 보는 텍스트의 종류로 해석합니다. 이것이 복사/붙여 넣기가 작동하지 않는 이유입니다.

이제 어떻게해야할까요? 사용자 지정 형식으로 작업을 계속하려면 해당 문자열을 읽고 필드로 구분하고 클래스 DataBase의 인스턴스를 만들고 인스턴스에서 문자열을 만드는 메서드를 작성하는 유틸리티 클래스를 만드는 것이 좋습니다.

표준 직렬화를 사용하려면 형식을 사용하고 형식을 잊어 버리십시오.

형식을 사용하고 직렬화와 함께 사용하려면 클래스의 직렬화 메커니즘을 사용자 지정해야합니다. 이렇게하려면 메소드 readObject()writeObject()을 구현하십시오. 자세한 내용은 here을 참조하십시오.

+0

감사합니다. 이것은 자바에서 내 첫 "큰"프로젝트이므로, 당신 같은 사람들로부터 배우는 것이 좋다. :) – tmq

관련 문제