将自定义对象的ArrayList写入File

时间:2014-07-04 11:48:54

标签: java android json gson

我有一个包含自定义Service对象的ArrayList。我想将整个ArrayList写入文件,然后能够读取它。

我为此尝试了Gson,但它给了我一个IllegalStateException:预期BEGIN_ARRAY但是STRING。我让它记录了应该是JSON的字符串,它说了很多异常(作为字符串中的文本......也许转换出错了?)。

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 个答案:

答案 0 :(得分:2)

我建议使用序列化进行此类操作。您可以实现Java的Serializable接口,然后您可以将对象缩小为.ser文件,然后从该文件中将它们充气,以从中调用所需的方法。

这是关于序列化的一个很好的教程 - http://www.tutorialspoint.com/java/java_serialization.htm

答案 1 :(得分: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;
}