2014-07-04 2 views
1

사용자 정의 서비스 객체를 포함하는 ArrayList가 있습니다. 나는 전체 ArrayList를 File에 쓰고 나중에 읽을 수 있기를 원한다.파일에 사용자 정의 객체의 ArrayList 쓰기

나는 그것을 위해 Gson을 시도했지만 IllegalStateException을 제공합니다. BEGIN_ARRAY가 예상되지만 STRING입니다. 나는 그것이 JSON이어야하는 문자열을 기록하게했다. 그리고 그것은 많은 예외 (String 내부의 텍스트로 .. 어쩌면 변환이 잘못 되었는가?)라고 말했다.

public int saveListToFile(){ 
     String filename = "service_entries"; 
     File file = new File(getFilesDir(), filename); 
     try { 
      BufferedWriter buffWriter = new BufferedWriter(new FileWriter(file, true)); 

      Gson gson = new Gson(); 
      String json = gson.toJson(services); //this is the ArrayList<Service> 

      buffWriter.append(json); 
      buffWriter.newLine(); 
      buffWriter.close(); 
     } catch (IOException e) { 
      return -1; 
     } 

     return 0; 
} 

public int readCurrentList(){ 
     String filename = "service_entries"; 

     File file = new File(getFilesDir(), filename); 
     try { 
      BufferedReader buffReader = new BufferedReader(new FileReader(file)); 

      String line1, line2; 
      Gson gson = new Gson(); 

      line1 = buffReader.readLine(); 
      line2 = buffReader.readLine(); 

      if(line1 == null){ 
       buffReader.close(); 
       return 0; 
      } 

      Type type = new TypeToken<ArrayList<Service>>(){}.getType(); 
      services = gson.fromJson(line1, type); 

      ArrayList<Service> list2; 
      if(line2 != null){ 
       list2 = gson.fromJson(line2, type); 

       services.addAll(list2); 
       list2 = null; 
      } 

      buffReader.close(); 
     } catch(IOException e){ 
      return -1; 
     } 

     return 0; 
} 

public class Service { 

     private double quantity; 
     private String description; 

     public Service(){ 
      quantity = 0.0; 
      description = null; 
     } 

} 

답변

2

이러한 작업에는 직렬화를 사용하는 것이 좋습니다. Java의 Serializable 인터페이스를 구현하면 개체를 .ser 파일로 압축 한 다음 해당 파일에서 다시 팽창시켜 필요한 메서드를 호출 할 수 있습니다. 약간의 비틀기와 http://www.tutorialspoint.com/java/java_serialization.htm

1

당신의 JSON 접근 방식은 잘 작동 -

여기 직렬화에 관한 좋은 튜토리얼입니다. 그러나 Booch의 솔루션은 이러한 종류의 요구 사항에 대한 이상적인 권장 사항입니다.

파일에 추가 할 때 아래의 방법으로 개체를 파일에 추가하고 읽을 때 이전에 작성한 모든 목록을 읽고이를 단일 목록으로 만듭니다. 서비스는 전역 변수이기 때문에 중복을 피하기 위해 메소드를 읽기 전에 초기화 또는 초기화를 고려해야합니다.

public int saveListToFile() { 
    String filename = "service_entries"; 
    File file = new File(getFilesDir(), filename); 
    try { 
     BufferedWriter buffWriter = new BufferedWriter(new FileWriter(file, true)); 
     Gson gson = new Gson(); 
     Type type = new TypeToken<List<Service>>() {}.getType(); 
     String json = gson.toJson(services, type); 
     buffWriter.append(json); 
     buffWriter.newLine(); 
     buffWriter.close(); 
    } catch (IOException e) { 
     return -1; 
    } 
    return 0; 
} 

public int readCurrentList() { 
    String filename = "service_entries"; 
    File file = new File(getFilesDir(), filename); 
    try { 
     BufferedReader buffReader = new BufferedReader(new FileReader(file)); 
     String line; 
     Gson gson = new Gson(); 
     Type type = new TypeToken<List<Service>>() {}.getType(); 
     while ((line = buffReader.readLine()) != null) { 
      services.addAll(gson.fromJson(line, type)); 
     } 
     buffReader.close(); 
    } catch (IOException e) { 
     return -1; 
    } 
    return 0; 
} 
관련 문제