載入與儲存本地JSON檔案
阿新 • • 發佈:2019-02-09
建立能以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目錄 |