1. 程式人生 > 實用技巧 >Android——資料儲存(一)(檔案儲存)

Android——資料儲存(一)(檔案儲存)

檔案儲存

檔案儲存是Android中最基本的一種資料儲存方式,它不對儲存內容進行任何的格式化處理,所有資料都是原封不動的儲存到檔案中的,因而它比較適合用於儲存一些簡單的文字資料或二進位制檔案。

資料從記憶體中寫入硬碟時的順序是:緩衝流->轉換流->檔案流,資料從硬碟中讀入記憶體時的順序是:檔案流->轉換流->緩衝流,緩衝流是字元流,檔案流是位元組流,所以需要轉換流在中間進行轉換。一般Stream為位元組,Writer和Reader為字元。

存檔案:利用Context類提供的openFileOutput()方法獲取FileOutputSteam物件,然後藉助獲取到的FileOutputStream物件構建出一個OutputStreamWriter物件,再借助OutputStreamWriter物件構建出一個BufferedWriter物件,最後就可以通過BufferedWriter物件進行寫操作將文字內容寫入檔案了。

String text = "aaaaaaaaaaa"  //要存入的內容
FileOutputStream out = null;
BufferedWriter writer = null;
try {
    out = openFileOutput("textdata", Context.MODE_PRIVATE);
    writer = new BufferedWriter(new OutputStreamWriter(out));
    writer.write(text);
}catch (IOException e){
    e.printStackTrace();
}
finally { try { if (writer != null){ writer.close(); } }catch (IOException e){ e.printStackTrace(); } }

  • openFileOutput(String name,int mode):Context類提供的用於將資料儲存到指定的資料夾中(/data/data/<packagename>/files/),返回一個FileOutputStream物件。第一個引數的要存的檔名(不包含路徑),第二個引數是檔案的操作模式,可以直接填0,或者具體的模式:

(1)Context.MODE_PRIVATE,預設的操作模式,當指定同一檔名時,所寫的內容會覆蓋原檔案的內容。

(2)Context.MODE_APPEND,該模式指定的檔名已存在時,就直接往檔案裡面追加內容,不存在就建立新檔案。

(3)Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE , 這兩個模式已經不建議使用了,因為這兩個模式允許其他應用程式對本程式中的檔案進行讀寫操作,容器引起安全漏洞。

  • FileOutputStream:檔案流(位元組輸出流)
  • OutputStreamWriter:轉換流(字元流),是從字元流到位元組流的橋樑:寫入到它的字元將使用指定的字符集編碼成位元組。它使用的字符集可以通過名稱指定,也可以明確指定,或者接受平臺的預設字符集。每次對write()方法的呼叫都會導致對給定字元呼叫編碼轉換器。生成的位元組在寫入底層輸出流之前先在緩衝區中累積。可以指定此緩衝區的大小,但預設情況下,它對於大多數目的都足夠大。注意,傳遞給write()方法的字元沒有緩衝。為了獲得最高的效率,可以考慮將OutputStreamWriter包裝在BufferedWriter中,以避免頻繁的轉換器呼叫。
  • BufferedWriter:緩衝流,字元輸出緩衝流,將文字寫入字元輸出流,緩衝字元,以便有效地寫入單個字元、陣列和字串。可以指定緩衝區大小,也可以接受預設大小。提供了一個newLine()方法,它使用了由系統屬性line.separator定義的平臺自己的行分隔符概念。並不是所有的平臺都使用換行符('\n')來結束行。因此,呼叫此方法終止每個輸出行比直接寫入換行符更可取。通常,寫程式會立即將輸出傳送到底層字元或位元組流。除非需要提示輸出,否則建議將BufferedWriter包裝在任何可能需要執行write()操作的Writer周圍,比如FileWriters和 OutputStreamWriters。

讀檔案:利用Context類提供的openFileInput()方法獲取FileInputSteam物件,然後藉助獲取到的FileInputStream物件構建出一個InputStreamReader物件,再借助InputStreamReader物件構建出一個BufferedReader物件,最後就可以通過BufferedReader物件進行讀操作將讀取檔案內容了。

FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
    in = openFileInput("textoutput");
    reader = new BufferedReader(new InputStreamReader(in));
    String line ="";
    while ((line = reader.readLine()) != null){
        content.append(line);
    }
}catch (IOException e){
    e.printStackTrace();
}finally {
    if (reader != null){
        try {
            reader.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

  • openFileInput(String name):Context類提供的用於從檔案中讀取資料。只有一個引數就是要讀取的檔名,系統會自動到/data/data/<packagename>/files/目錄下讀取,並返回一個FileInputStream物件。
  • FileOutputStream:檔案流(位元組輸入流)
  • InputStreamReader:轉換流(字元流),是從位元組流到字元流的橋樑:它讀取位元組並使用指定的字符集將它們解碼為字元。它使用的字符集可以通過名稱指定,也可以明確指定,或者接受平臺的預設字符集。每次呼叫InputStreamReader的read()方法都會導致從底層位元組輸入流中讀取一個或多個位元組。為了能夠有效地將位元組轉換為字元,可以預先從底層流讀取比滿足當前讀取操作所需的位元組更多的位元組。為了提高效率,可以考慮將InputStreamReader包裝在BufferedReader中。
  • BufferedReader:從字元輸入流中讀取文字,緩衝字元以提供對字元、陣列和行的有效讀取。可以指定緩衝區大小,也可以使用預設大小。預設值對於大多數目的來說都足夠大了。通常,讀取器發出的每個讀取請求都會導致對底層字元或位元組流發出相應的讀取請求。因此,建議在任何讀取()操作開銷較大的閱讀器(如檔案閱讀器和inputstreamreader)周圍包裝一個BufferedReader。