java/Android 中的文件儲存

一.前言

    文件儲存是一種最基本的數據存儲方式,它不對存儲的內容進行任何的格式化處理,所有數據都是原封不動的保存到文件當中的,因而比較適合存儲一些簡單的文本數據或二進制;如果想要保存一些較爲複雜的文本數據,就需要定義一套自己的格式規範,方便之後將數據從文件中解析出來。

    在瞭解文件存儲之前,先了解IO流的概念。

    IO流即輸入輸出流,流是一組有順序的,有起點和終點的字節結合,是對數據傳輸的總稱。即數據在兩設備間的傳輸稱爲流,流的本質是數據傳輸。

    IO流可以分爲字節流和字符流,給出相應的IO 結構圖[1]。

    

    總結寫在前面,很重要,很關鍵:

    不論是對文件進行讀取或是寫入操作,和文件進行操作的 IO 流都是字節流,即往文件裏面寫的流的形式是字節流,讀取文件內容得到的流的形式也是字節流。

二. 將數據寫入文件(openFileOutput)

2.1 寫操作相關的類和方法

1. Context 類中的openFileOutput() 函數

2. OutputStreamWriter 類

3. BufferedWriter 類

2.2 用法與釋義

1. FileOutputStream out = openFileOutput("data",Context.MODE_PRIVATE)

    用於將文件存儲到指定的文件中,第一個參數是文件名,不可以包含路徑,會自動依據文件名創建文件data.txt,因爲所有的文件都是默認存儲到/data/data/<package_name>/files/ 目錄下的。第二個參數是文件的操作模式,可選MODE_PRIVATE和MODE_APPEND.

    該方法返回FileOutputStream,稱作文件輸出流,用於對文件的寫入操作,也稱字節流。

2.  new OutputStreamWriter(out)

    OutputStreamWriter 是字符流 ==》字節流的橋樑,使用指定的編碼方式,將寫入流中的字符編碼成爲字節流。

3.BufferedWriter write = new BufferedWrite (new OutputStreamWriter(out))

    創建字符流緩衝區,將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。可以指定緩衝區的大小,或者接受默認的大小。在大多數情況下,默認值就足夠大了。

寫入文件的代碼實現,參看下面的實現:

字符輸出流 ==》轉化流 ==》 字節流 ==》 文件

此處需要注意,在關閉緩衝流之前,需要通過flush()方法刷新該流的緩衝,防止緩衝區中還有存在部分數據沒有寫入底層輸出流。

三. 從文件讀取數據(openFileInput)

3.1 讀操作涉及的相關類和方法

1. Context 類中的 openFileInput("data")方法

2. InputStreamReader 類

3. BufferedReader 類

4. StringBuilder 類

3.2 用法與釋義

1.FileInputStream in = openFileInput("data") ;

    類似於將數據存儲到文件中,Context類中還提供了一個openFileInput()的方法, 用於從文件中讀取數據。只接受一個參數,即要讀取的文件名,同樣也不能寫路徑,因爲系統會自動到/data/data/<package_name> 中去加載文件。

2. new InputStreamReader(in)

    InputStreamReader() 與OutputStreamWriter()相反,是 字節流 =》字符流  的 橋樑。

3. BufferedReader  reader = new BufferedReader(new InputStreamReader (in));

    line = reader.readLine();

        創建字符流緩衝區,每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層(指內存中的文件)輸入流讀取一個或多個字節。

4. StringBuilder content = new StringBuilder();

    content.append(line);

    Java中雖然可以通過+直接拼接字符串,但是,在循環中都會創建新的字符串對象,然後扔掉舊的字符串。這樣,絕大部分字符都是臨時對象,不但浪費內存,還會影響GC效率。

爲了可以高效拼接字符串,Java 標準庫踢動了StringBuilder類,可以預分配緩衝區,往StringBuilder 中新增字符串是,不會創建新的臨時對象。

5.讀取文件數據的實現,見如下:

文件 ==》 字節流 ==》轉換流 ==》字符流

五.參考資料

1. https://www.iteye.com/blog/longpo-2201767

2. https://blog.csdn.net/ai_bao_zi/article/details/81168420

3. https://blog.csdn.net/lipinganq/article/details/53427102

4. https://blog.csdn.net/qq_27093465/article/details/53308032

5. https://blog.csdn.net/weijinqian0/article/details/75351560

6. java 中StringBuilder https://www.liaoxuefeng.com/wiki/1252599548343744/1260471862687712

發佈了29 篇原創文章 · 獲贊 2 · 訪問量 8968
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章