1. 程式人生 > >Android程式設計學習筆記 之 File資料儲存

Android程式設計學習筆記 之 File資料儲存

File檔案可用來存放大量資料,如文字、圖片、音訊、視訊等。

在Android的資料儲存操作和Java中的IO流差不多的用法。

進行File資料儲存的步驟如下:

開啟一個File物件

開啟一個FileOutputStream檔案輸出流,寫入資料

開啟一個FileInputStream檔案輸入流,讀取資料

我們先要獲取File物件,才能開啟一個檔案輸入輸出流。

在Android在Context下有一些自帶的獲取File物件的方法,在這些路徑中,裡面的檔案會隨著APP的解除安裝而刪除,不會殘留資料垃圾。

File getFilesDir();//獲取/data/data/包名/files 的File物件,預設的資料儲存目錄
File getCacheDir();//獲取/data/data/包名/cache 的File物件,預設的快取檔案儲存位置,系統會自動刪除
File getExternalFilesDir();//獲取/mnt/sdcard/Android/data/包名/files 的File物件,預設的外部的資料儲存目錄
File getExternalCacheDir();//獲取/mnt/sdcard/Android/data/包名/cache 的File物件,預設的外部的快取檔案儲存位置

File getDir("資料夾名", MODE_PRIVATE);//獲取/data/data/包名/app_資料夾名  目錄,預設的資料儲存目錄

而如果不按照上面的方法進行儲存資料,想要在自定義的位置儲存檔案,則在APP解除安裝後,資料不會自動刪除,殘留資料垃圾。

並且,我們需要在AndroidManifest.xml裡面寫入這兩個許可權,並獲取File物件,寫入讀取資料

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--在SD卡中建立與刪除檔案的許可權-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!--向SD卡寫入資料的許可權-->
File file = new File("/mnt/sdcard/test");//new一個File物件,指向/mnt/sdcard/test,不管存不存在
if(file.exists()){//判斷File是否存在
	file.createNewFile();//不存在的話就新建該檔案
}

除了上面的方法外,我們還可以直接使用openFileOutput()openFileInput()獲取檔案輸出輸入流物件

他們指定在/data/data/包名/files目錄下新建一個name檔案,注意檔案最好加上字尾名,如:demo.txt

FileOutputStream fos = openFileOutput(String name, int mode);//name表示檔名
FileInputStream fis = openFileInput(String name);//檔名

mode引數指示開啟檔案的模式,在之前的SharedPreferences中有介紹過。

這兩個過時的許可權會造成安全漏洞,有需要的話可以使用ContentProvider來代替。

  1. MODE_PRIVATE//私有模式,只能被應用本身訪問,在該模式下寫入的內容會覆蓋原檔案
  2. MODE_APPEND//追加模式,存在就往檔案追加內容,否則建立新檔案
  3. MODE_WORLD_READABLE//只讀模式,允許其他應用進行讀操作(已過時)
  4. MODE_WORLD_WRITEABLE//讀寫模式,允許其他應用進行讀、寫操作(已過時)

以下是demo原始碼

public class MainActivity extends Activity {
    Button privateButton,appendButton;
    EditText inputEdit;
    TextView outputText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        privateButton = (Button) findViewById(R.id.privateButton);
        appendButton = (Button) findViewById(R.id.appendButton);
        inputEdit = (EditText) findViewById(R.id.inputEdit);
        outputText = (TextView) findViewById(R.id.outputText);

        privateButton.setOnClickListener(new View.OnClickListener() {//私有模式
            @Override
            public void onClick(View view) {
                try {
                    FileOutputStream fos = openFileOutput("test1.txt", MODE_PRIVATE);//以私有模式開啟一個test1.txt檔案的檔案輸出流
                    fos.write(inputEdit.getText().toString().getBytes());//寫入資料,記得轉換為byte[]型別
                    fos.close();//關閉檔案輸出流

                    FileInputStream fis = openFileInput("test1.txt");//開啟一個指向test1.txt的檔案輸入流
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();//new 一個緩衝陣列輸出流物件
                    byte[] buf = new byte[1024];
                    int len;
                    while((len=fis.read(buf)) != -1) {
                        baos.write(buf, 0, len);//寫入緩衝區
                    }
                    outputText.setText(baos.toString());//從緩衝區中讀取
                    baos.close();
                    fis.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        appendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    FileOutputStream fos = openFileOutput("test2.txt", MODE_APPEND);//同上,這次是以追加模式開啟
                    fos.write(inputEdit.getText().toString().getBytes());//檔案儲存在/data/data/包名/files/test2.txt
                    fos.close();

                    FileInputStream fis = openFileInput("test2.txt");
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    byte[] buf = new byte[1024];
                    int len;
                    while((len=fis.read(buf))!=-1){
                        baos.write(buf, 0, len);
                    }
                    outputText.setText(baos.toString());
                    baos.close();

                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    }

}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:id="@+id/inputEdit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/privateButton"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Private"/>
    <Button
        android:id="@+id/appendButton"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Append" />
    <TextView
        android:id="@+id/outputText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="讀取內容"/>
</LinearLayout>


相關推薦

Android程式設計學習筆記 File資料儲存

File檔案可用來存放大量資料,如文字、圖片、音訊、視訊等。 在Android的資料儲存操作和Java中的IO流差不多的用法。 進行File資料儲存的步驟如下: ①開啟一個File物件 ②開啟一個FileOutputStream檔案輸出流,寫入資料 ③開啟一個FileIn

Android程式設計學習筆記 SQLite資料儲存

SQLite是一個輕量級的嵌入式的資料庫,我們在Android開發中不需要安裝任何外掛即可使用, 如果是root過的手機,可以在data/data/包名/databases裡面找到db資料庫檔案,推薦

Android程式設計學習筆記 Fragment與Activity的資料傳遞

傳遞方向的不同: ①Activity----->Fragment: 在Activity中建立Bundle資料包,並呼叫Fragment的setArguments(Bundle bundle)方法 ②Fragment----->Activity: 需要在Frag

Android程式設計學習筆記 ListActivity原始碼詳解

前言 最近在研究PreferenceActivity發現是繼承自ListActivity的,開啟看了下ListActivity的原始碼,發現也不長,就詳細閱讀認識一下。 正文 ListActi

Android 學習筆記14:資料儲存

android的資料儲存有4中方式 sharedPreferences、SQLite、content provider和file sharePreferences 提供輕量型資料儲存, 一般使用者儲存配置資訊 本質上是xml檔案上的鍵值對,通常用來儲存一些簡單的配置資訊。其

併發程式設計學習筆記Java儲存模型(十三)

概述 Java儲存模型(JMM),安全釋出、規約,同步策略等等的安全性得益於JMM,在你理解了為什麼這些機制會如此工作後,可以更容易有效地使用它們. 1. 什麼是儲存模型,要它何用. 如果缺少同步,就會有很多因素會導致執行緒無法立即,甚至永遠無法看到另一個執行緒的操作所產生的結果: 編譯器生成指令的次序,可

併發程式設計學習筆記顯示鎖(十一)

ReentrantLock(重進入鎖)並不是作為內部鎖(synchronized)機制的替代,而是當內部鎖被證明受到侷限時,提供可選擇的高階特性. 1. Lock 和 ReentrantLock Lock介面: public interface Lock { void lock();

併發程式設計學習筆記構建自定義的同步工具(十一)

概述: 在併發程式設計學習筆記之併發工具類(四)中,為大家介紹了幾種同步工具(同步工具就是依靠自己的狀態,調節執行緒是阻塞還是執行用的.),閉鎖、FutureTask、訊號量、關卡. 使用以上的同步工具大部分時候可以滿足我們的需求,但是如果沒能滿足我們需要的功能,可以使用語言和類庫提供的底層

併發程式設計學習筆記原子變數與非阻塞同步機制(十二)

概述 java.util.concurrent包中的許多類,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用Synchronized更好的效能和可伸縮性.這是因為它們的內部實現使用了原子變數和非阻塞的同步機制. 近年來很多關於併發演算法的研究都聚焦在非阻塞演算法(nonb

JavaScript高階程式設計學習筆記事件

1、事件流 事件流描述的是從頁面中接收事件的順序。 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件開始時由最具體的元素(文件中巢狀層次最深的那個節點)接收,然後逐級向上傳播到較為不具體的節點(文件)。(DOM樹向上傳播)(通俗解釋(個人理解: 當一個元素上的事件被觸發的時候,比如

Redis學習筆記基本資料結構

Redis基礎資料結構 Redis有5種基本資料結構:String(字串)、list(列表)、set(集合)、hash(雜湊)、zset(有序集合) 字串string 字串型別是Redis的value最簡單的資料結構,類似與Java語言中的ArrayList(數

併發程式設計學習筆記可伸縮性(九)

很多改進效能的技術增加了複雜度,因此增加了安全和活躍度失敗的可能性. 更糟糕的是,有些技術的目的是改善效能,事實上產生了相反的作用,帶來了其他的效能問題. 資料的正確性永遠是第一位的,保證程式是正確的,然後再讓它更快.只有當你的效能需求和評估標準需要程式執行得更快時,才去進行改進. 在設計併發應用程式的時候,

學習筆記Python資料型別-Number

Number Python 2 中的數字,支援int, float, bool, complex, long這些資料型別,其中long(即長整型)很少用。 int >>> v1 = 10 >>> type(v1) #type()方法可

Lucene學習筆記-核心資料結構PriorityQueue的實現原理

Luene的核心應用場景是全文檢索。簡單來說,就是通過使用者輸入的關鍵詞來匹配相關文件,然後根據匹配程度返回TopN的查詢結果給使用者。 這裡需要解決的一個核心問題就是如何快速返回TopN的結果,這本質上是一個排序的問題。說起排序,我們有很多選擇,冒泡,快排,歸併...。 這些排序演算法在資料量小的時候,不是

學習筆記Python資料型別-String

字串 字串或串(String)是由數字、字母、下劃線組成的一串字元。一般記為s=“a1a2···an”(n>=0)。它是程式語言中表示文字的資料型別。 兩個字串相等的充要條件是:長度相等,並

從零開始學Python學習筆記-----pandas資料框(1)

作為從事資料相關工作朋友,平時接觸的更多的可能是一張有板有眼的資料表格,在這裡我們就叫作資料框。在Python中可以通過pandas模組的DataFrame函式構造資料框。 1、資料框的構造 在Python中,可以藉助於列表、元組、字典進行手工構建資料框,我們用例子說明:

程式設計學習筆記Java相關vector向量的介紹

在Java中,有一個包叫java.util,它是一個儲存著各種常用工具類的類庫,其中就包括向量(vector)。向量是一種類似陣列的順序儲存的資料結構,但是它的功能比陣列強大的多。比如,Vector類的物件是允許不同型別大小的元素共存的變長陣列,Vector類的物件不但可以

Go學習筆記高階資料型別

高階資料型別,僅僅是做個概念認識,等到其他相關知識的學習時,再著重分析。 1 function 將 function 作為資料型別的語言有很多,函數語言程式設計的核心理念。 function 是“第一等公民”,function 與其他資料型別一樣,處於平等地位,可以賦值給

Pandas學習筆記重複資料統計

在醫院統計計算績效資料,通過在網上搜索,發現Pandas確實在資料處理確實快。本文章持續更新和更改,只供自己學習使用 一、重複資料查詢: Pandas提供duplicated函式標記重複 pandas.DataFrame.duplicated(self,

Android基礎學習筆記-ListView進階用法(item圓角效果實現)

今天簡單用快取優化方式實現了listview的功能,下面讓我們實現一下上篇文章留下來的改進方案:     1).實現item佈局的圓角效果     2).對listview的item進行監聽