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