Android学习之本地文件的存储与加载

时间:2023-02-01 08:38:39

前言

几乎所有应用都需要有个地方存储数据。本篇文章,哥们将实现保存并加载存储在设备上的JSON文件数据。

为什么要写这篇文章呢?说来惭愧,哥们昨晚被读取本地json文件的算法给搞得蛋疼,调试来调试去就是不成功,最后在Stack Exchange站点上找到灵感!

特撰笔此文!以铭记!也为帮助更多有此困惑的朋友!

本地文件的存储

可保存的数据格式是JSON。哥们将使用Context类的I/O方法写入或读取文件。

首先来保存数据到json文件,举例来说,有以下Model:

public class News {
private UUID mId;
private String mTitle;
private Date mDate;

public News() {
mId = UUID.randomUUID();
mDate = new Date();
}

//这个是写入
使用Android SDK内置标准的org.json类包,可以利用其中的类和方法来创建和解析JSON文件
public JSONObject toJSON() throws JSONException {
JSONObject json = new JSONObject();
json.put(JSON_ID, getId());
json.put(JSON_TITLE, getTitle());
//注意这里Date写入的是long型
json.put(JSON_DATE, getDate().getTime());
return json;
}

//这个是读取,文件的加载需要用到
public Crime(JSONObject json) throws JSONException {
mId = UUID.fromString(json.getString(JSON_ID));
mTitle = json.getString(JSON_TITLE);
//注意这里Date读取的也是long型
mDate = new Date(json.getLong(JSON_DATE));
}

省略getter,setter
}

需要注意的地方,哥们都写入注释里了!

然后写个控制文件存取的类,AndroidFileIO:

public class AndroidFileIO {

private Context mContext;
private String mFilename;
//传入Context,因为需要她来保存和加载文件
public AndroidFileIO(Context c, String f){
mContext = c;
mFilename = f;
}

//保存News里的数据到json文件
public void saveNews(ArrayList<News> news) throws JSONException {
JSONArray jsonArray = new JSONArray();
for (News n : news) {
//调用toJSON,将数据保存为json对象
jsonArray.put(n.toJSON());
}

Writer writer = null;
try {
//打开文件进行写入
OutputStream out = mContext.openFileOutput(mFilename, Context.MODE_PRIVATE);
writer = new OutputStreamWriter(out);
writer.write(jsonArray.toString());
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}

}

下面来写读取json文件:

本地文件的加载

AndroidFileIO类添加以下内容:

public ArrayList<News> loadNews() throws JSONException, IOException {
ArrayList<News> news= new ArrayList<News>();
BufferedReader reader = null;
//打开并从文件中读取数据到StringBuilder
try {
//打开文件进行读取
InputStream in = mContext.openFileInput(mFilename);
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder jsonString = new StringBuilder();
String line;
while ( (line=reader.readLine()) != null ) {
jsonString.append(line);
}
//使用JSONTokener解析jsonString为JSONArray
JSONArray array = (JSONArray) new JSONTokener(jsonString.toString()).nextValue();
//通过JSONObject构建News的数组
for (int i=0;i<array.length();i++) {
//传入JSON对象
News n = new News(array.getJSONObject(i));
news.add(n);
}
} catch (FileNotFoundException e) {
//当应用首次启动时,没有数据会抛出异常,异常不用捕获
Log.d(TAG, "未找到文件!");
} finally {
if (reader != null) {
reader.close();
}
}

return news;
}

最后在管理News对象的创建的类中实例化以上AndroidFileIO类,调用相关方法以实现文件存取功能,并显示在View中。

Note:最好覆盖OnPause方法,在其中也调用一遍存储方法。

附加内容

访问文件与目录

应用访问文件和目录最便捷的方式是使用Context类提供的方法。
Context类是所有关键应用组件的超类,常见的几个应用组件有:Application、Activity和Service。因此,这些子类可使用Context类提供的方法(如表所示)轻松访问文件和目录。

Android学习之本地文件的存储与加载

注意,表中大多数方法返回了标准Java类实例,如java.io.File或java.io.FileInputStream。
如同其他Java应用中各种Java API的配合使用,这里也可以将现有的Java API与表中Context类方法返回的类搭配使用。Android也支持java.nio.*包中提供的各种类。

好,就写到这里了,如果你有任何问题,也请在评论中指出交流!!!