1. 程式人生 > >載入與儲存本地JSON檔案

載入與儲存本地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目錄

程式碼地址