Android学习之本地文件的存储与加载
2015-08-17 17:42
579 查看
前言
几乎所有应用都需要有个地方存储数据。本篇文章,哥们将实现保存并加载存储在设备上的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类提供的方法(如表所示)轻松访问文件和目录。
注意,表中大多数方法返回了标准Java类实例,如java.io.File或java.io.FileInputStream。
如同其他Java应用中各种Java API的配合使用,这里也可以将现有的Java API与表中Context类方法返回的类搭配使用。Android也支持java.nio.*包中提供的各种类。
好,就写到这里了,如果你有任何问题,也请在评论中指出交流!!!
相关文章推荐
- 我的第一篇博客:关于 Android 引用其他项目或工程 小小建议一是分享,二是加固记忆
- Android如何自定义视图之测量和布局原理(一)
- Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
- 移动浏览器Chrome 32 for Android移除300ms点击推迟
- Android 对text文本内容添加下划线
- android中Widget的生命周期
- Android Volley完全解析(一),初识Volley的基本用法
- Android Volley完全解析(一),初识Volley的基本用法
- Android统计图表之柱状图(条形图)
- Android:使用SparseArray代替HashMap优化性能
- Android apk动态加载机制的研究
- 【Android应用开发技术:用户界面】布局管理器
- android 开发环境搭建
- Mahone的CTS研究笔记(三):CTS的测试内容概况(上)
- Android中(Service )服务的最佳实践——后台执行的定时任务
- Getting net::ERR_UNKNOWN_URL_SCHEME while calling telephone number from HTML page in Android
- android中使用gdbserver调试c程序
- Android_如何查看应用签名信息
- android加密解密算法之3DES算法用例
- android