1. 程式人生 > >Android學習之本地檔案的儲存與載入

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類提供的方法(如表所示)輕鬆訪問檔案和目錄。

注意,表中大多數方法返回了標準Java類例項,如java.io.File或java.io.FileInputStream。
如同其他Java應用中各種Java API的配合使用,這裡也可以將現有的Java API與表中Context類方法返回的類搭配使用。Android也支援java.nio.*包中提供的各種類。

好,就寫到這裡了,如果你有任何問題,也請在評論中指出交流!!!

相關推薦

Android學習本地檔案儲存載入

前言 幾乎所有應用都需要有個地方儲存資料。本篇文章,哥們將實現儲存並載入儲存在裝置上的JSON檔案資料。 為什麼要寫這篇文章呢?說來慚愧,哥們昨晚被讀取本地json檔案的演算法給搞得蛋疼,除錯來除錯去就是不成功,最後在Stack Exchange站點上找到靈

Android複習旅--檔案儲存

內部儲存 內部儲存是指將應用程式中的資料以檔案方式儲存到裝置的內部儲存空間中(該檔案位於 data/data// 目錄下)。 一般情況下應用儲存在記憶體下的資料其他應用是訪問不了的,當您希望確保使用者或其他應用均無法訪問您的檔案時,內部儲存是最佳選擇。使用者解除安裝

Android學習SQLite資料庫儲存

  今天學習sqlite資料庫儲存,sqlite資料庫是輕量級的,非常小,只有幾百K大小,非常 移動裝置使用,幾乎所有的手機使用的都是sqlite資料庫。   sqlite儲存的資料型別:.db   資料儲存的路徑:/data/data/packageName/d

Android學習 Activity堆疊管理控制

    App程式中有很多Activity、你可以通俗的理解為把一個Activity看做是一個UI介面。在Andord系統中Activity是以堆疊<堆疊的特性:只有壓入和彈出  先進後出>的形式存在。堆疊中的根Activity就是應用程式的啟動Activity

Keras 深度學習程式碼筆記——模型儲存載入

你可以使用model.save(filepath)將Keras模型和權重儲存在一個HDF5檔案中,該檔案將包含: 模型的結構,以便重構該模型 模型的權重 訓練配置(損失函式,優化器等) 優化器的狀態,以便於從上次訓練中斷的地方開始 使用keras.mod

Android學習 記憶體管理機制應用記憶體優化

    Random Access Memory(RAM)在任何軟體開發環境中都是一個很寶貴的資源。這一點在實體記憶體通常很有限的移動作業系統上,顯得尤為突出。儘管Android的Dalvik虛擬機器扮演了常規的垃圾回收的角色,但這並不意味著你可以忽視app的記憶體分配與釋放的時機與地點。於大多數apps來說

Android學習 Scroller的介紹使用

類概述 Android裡Scroller類是為了實現View平滑滾動的一個Helper類。通常在自定義的View時使用,在View中定義一個私有成員mScroller = new Scroller(context)。設定mScroller滾動的位置時,並不會

Android 儲存學習使用SharedPreference儲存檔案

上兩節我們都是使用文字檔案儲存使用者的資訊,這明顯是存在漏洞的。同時對檔案中的內容不好管理。今天我們學習用SharedPreference儲存。sharedPreference是專門儲存一些比較零散的資料的。 我們還是用上節的例子分析,將使用者的資訊使用SharedPref

Android學習SharedPreferences儲存小練習

  SharedPreferences是Android平臺上一個輕量級的儲存類,用來儲存應用的一些常用配置,比如Activity狀態,Activity暫停時,將此activity的狀態儲存到SharedPereferences中;當Activity過載,系統回撥方法onSav

Android Studio學習檔案的基本瞭解

android Studio學習基本知識掌握 1、首先找到app-src-main-AndroidManifest.xml檔案,找到以下程式碼,這段程式碼表示對所建立的活動進行註冊 <activity android:name=".MainActiv

Android學習基礎知識九—資料儲存(持久化技術)

  資料持久化是將那些記憶體中的瞬時資料儲存到儲存裝置,保證即使在手機或電腦關機的情況下,這些資料仍然不會丟失。   Android系統中主要提供了3種方式用於簡單地實現資料持久化功能:檔案儲存、SharedPreference儲存、資料庫儲存。除了這三種方式外,還可以將資料儲存在手機的SD卡中,不過相對比

[TensorFlow深度學習入門]實戰八·簡便方法實現TensorFlow模型引數儲存載入(pb方式)

[TensorFlow深度學習入門]實戰八·簡便方法實現TensorFlow模型引數儲存與載入(pb方式) 在上篇博文中,我們探索了TensorFlow模型引數儲存與載入實現方法採用的是儲存ckpt的方式。這篇博文我們會使用儲存為pd格式檔案來實現。 首先,我會在上篇博文基礎上,實現由c

[TensorFlow深度學習入門]實戰七·簡便方法實現TensorFlow模型引數儲存載入(ckpt方式)

[TensorFlow深度學習入門]實戰七·簡便方法實現TensorFlow模型引數儲存與載入(ckpt方式) TensorFlow模型訓練的好網路引數如果想重複高效利用,模型引數儲存與載入是必須掌握的模組。本文提供一種簡單容易理解的方式來實現上述功能。參考部落格地址 備註: 本文采用的

C++學習deque底層儲存結構迭代器失效情況

C++ STL容器deque和vector很類似,也是採用動態陣列來管理元素。 使用deque之前需包含標頭檔案: #include <deque> 它是定義在名稱空間std內的一個class template: template<class _

Android學習基礎知識九 — 資料儲存(持久化技術)SQLite資料庫儲存

  前面一講介紹了資料持久化技術的前兩種:檔案儲存、SharedPreferences儲存。下面介紹第三種技術:SQLite資料庫儲存 一、SQLite資料庫儲存   SQLite資料庫是一款輕量級的關係型資料庫,它的運算速度非常快,佔用資源很少,通常只需要幾百KB的記憶體就足夠了,因而特別適合在移動裝置

Android學習基礎知識九 — 資料儲存(持久化技術)使用LitePal操作資料庫

  上一節學習了使用SQLiteDatabase來操作SQLite資料庫的方法,接下來我們開始接觸第一個開源庫:LitePal。LitePal是一款開源的Android資料庫框架,它採用了物件關係對映(ORM)的模式,並將我們平時開發最常用到的一些資料庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種

Android學習使用正則表示式PatternMatcher來判斷字串格式

/** * 主介面 * * @author yuzhentao */ public class MainActivity extends Activity implements View.OnClickListener{ private Context context; privat

Android開發呼叫相機拍照本地相簿選擇圖片

使用者看到的介面如下,也是我的xml介面: demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖: 點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖: 這時候你可以直接點選確定,也可

Android學習圖片非同步載入框架Picasso

原創地址:http://mcode114.com/android/network/picasso/ Picasso Picasso是Square公司開源的一個Android圖形快取庫。可以實現圖片下載和快取功能。僅僅只需要一行程式碼就能完全實現圖片的非同步載入。使用複

Android學習使用HttpURLConnection上傳單個檔案

package com.example.youyige.util; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.