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

前言

几乎所有应用都需要有个地方存储数据。本篇文章,哥们将实现保存并加载存储在设备上的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学习之本地文件的存储与加载_第1张图片

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

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

你可能感兴趣的:(android,数据)