加载与存储本地JSON文件

创建能以JSON文件格式保存的实体

    public Crime(JSONObject json) throws JSONException{
        mId = UUID.fromString(json.getString(JSON_ID));
        if(json.has(JSON_TITLE))
            mTitle = json.getString(JSON_TITLE);
        mSolved = json.getBoolean(JSON_SOLVED);
        mDate = new Date(json.getLong(JSON_DATE));
    }

    /** * 将Crime对象数据转换为可写入JSON文件的JSONObject对象数据。 */
    public JSONObject toJson() throws JSONException{
        JSONObject json = new JSONObject();
        json.put(JSON_ID, mId.toString());
        json.put(JSON_TITLE, mTitle);
        json.put(JSON_SOLVED, mSolved);
        json.put(JSON_DATE, mDate.getTime());
        return json;
    }

创建JSON文件的保存与读取类

package com.huangfei.criminalintent;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONTokener;

import android.content.Context;
/** * JSON文件的保存与读取 */
public class CriminalIntentJSONSerializer {
    private Context mContext;
    private String mFilename;

    public CriminalIntentJSONSerializer(Context context, String filename) {
        super();
        mContext = context;
        mFilename = filename;
    }

    /** * JSON文件的读取 * @throws JSONException */
    public ArrayList<Crime> loadCrimes() throws IOException, JSONException{
        ArrayList<Crime> crimes = new ArrayList<Crime>();
        BufferedReader reader = null;

        try {
            FileInputStream in = mContext.openFileInput(mFilename);
            reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder jsonString = new StringBuilder();
            String line = null;
            while((line = reader.readLine()) != null){
                jsonString.append(line);
            }

            JSONArray array = (JSONArray) new JSONTokener(jsonString.toString()).nextValue();
            for (int i = 0; i < array.length(); i++) {
                crimes.add(new Crime(array.getJSONObject(i)));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if(reader != null)
                reader.close();
        }

        return crimes;
    }

    /** * JSON文件的保存 */
    public void saveCrimes(ArrayList<Crime> crimes) throws JSONException, IOException {
        JSONArray array = new JSONArray();
        for (Crime crime : crimes) {
            array.put(crime.toJson());
        }
        Writer writer = null;

        try {
            /** * Context.openFileOutput(...)方法接收文件名(不能是目录即不能包含/)以及文件操作模式参数,会自动将传入的文件名附加到应用沙盒文件 * (每个应用的沙盒文件目录都是设备/data/data/目录的子目录,且默认以应用包命名。如:/data/data/com.huangfei.criminalintent。 * 只有在设备被root了,其他应用和用户才能随意获取沙盒中的文件。) * 目录路径之后,然后在新路径下创建并打开文件,等待数据写入。 */
            FileOutputStream out = mContext.openFileOutput(mFilename, Context.MODE_PRIVATE);
            writer = new OutputStreamWriter(out);
            writer.write(array.toString());
        } finally{
            if(writer != null)
                writer.close();
        }
    }
}

JSON文件的读取与保存

        mSerializer = new CriminalIntentJSONSerializer(mAppContext, FILENAME);
        try {
            mCrimes = mSerializer.loadCrimes();
        } catch (Exception e) {
            mCrimes = new ArrayList<Crime>();
            e.printStackTrace();
        }
public boolean saveCrimes(){
        try {
            mSerializer.saveCrimes(mCrimes);
            Log.d(TAG, "crimes saved to file");
            return true;
        } catch (Exception e) {
            Log.e(TAG, "Error saving crimes: ", e);
            return false;
        } 
    }

Context类提供的基本文件或目录处理方法

方法 使用目的
File getFileDir() 获取/data/data/packagename/files目录
FileInputStream openFileInput(String name) 打开现有文件进行读取
FileOutputStream openFileOutput(String name, int mode) 打开文件进行写入,若不存在就创建它
File getDir(String name, int mode) 获取/data/data/packagename/目录的子目录(若不存在就创建它)
String[] fileList() 获取/data/data/packagename/files目录下的文件列表
File getCacheDir() 获取/data/data/packagename/cache目录

代码地址

你可能感兴趣的:(json,存储)