1. 程式人生 > >Android中對/data/data//files下檔案的讀寫操作

Android中對/data/data//files下檔案的讀寫操作

本文重點展示,對/data/data/<package name>/files中檔案的讀寫操作的實現。

      一、寫出資料到files資料夾中,Activity提供了openFileOutput()方法,可以把資料輸出到/data/data/<package name>/files的資料夾中。

  1. publicclass FileActivity extends Activity {    
  2.    @Override
  3.    publicvoid onCreate(Bundle savedInstanceState) {    
  4.        ...    
  5.    FileOutputStream outStream = this
    .openFileOutput("%%.txt",  
  6. Context.MODE_PRIVATE);    
  7.        outStream.write("測試".getBytes());    
  8.        outStream.close();      
  9.    }    
  10. }    

  第一個引數:指定檔名稱,不能包含路徑分隔符“/” ,如果檔案不存在,Android 自動建立它。儲存在/data/data/<package name>/files目錄中,如: /data/data/cn.%%.action/files/ceshi.txt 。
     第二引數用於指定操作模式,有四種模式,分別為:
  1. Context.MODE_PRIVATE    
  2.       Context.MODE_APPEND    
  3.       Context.MODE_WORLD_READABLE    
  4.       Context.MODE_WORLD_WRITEABLE    

  可以同時傳入一種以上的模式如:
  1. openFileOutput("ceshi.txt", Context.MODE_WORLD_READABLE + Context.MODE_  
  2. WORLD_WRITEABLE);    

二、讀取 /data/data/<package name>/files/ceshi.txt中的資料。直接上程式碼:

  1. FileInputStream inStream = context.openFileInput(ceshi.txt);//只需傳檔名  
  2.    ByteArrayOutputStream outStream = new ByteArrayOutputStream();//
  3. 輸出到記憶體    
  4.    int len=0;    
  5.    byte[] buffer = newbyte[1024];    
  6.    while((len=inStream.read(buffer))!=-1){    
  7.        outStream.write(buffer, 0, len);//  
  8.    }    
  9.    byte[] content_byte = outStream.toByteArray();    
  10.    String content = new String(content_byte);    
  11.    system.out.println(content)    

總結:重點注意的地方就是openFileOutput()的第一個引數和openFileInput()的引數,不需要寫絕對路徑,只需寫檔名就可以了!

附言:當然讀取資料時也可以用絕對路徑,沒有本文所述的方便,比如讀取檔案時可以用:

  1. Context context=MainActivity.this;//首先,在Activity裡獲取context    
  2. File file=context.getFilesDir();      
  3. String path=file.getAbsolutePath();    
  4. System.out.println(path);    
  5. File file = new File(path+ceshi.txt);    
  6. FileInputStream inStream = new FileInputStream(file);//需傳路徑: /data/data/cn.itheima.rw_file/files/ceshi.txt  
上邊幾行的程式碼的作用僅僅相當於下邊這一句程式碼的作用:

context.openFileInput("ceshi.txt");  

補充:

首先給大家介紹使用檔案如何對資料進行儲存,Activity提供了openFileOutput()方法可以用於把資料輸出到檔案中,具體的實現過程與在J2SE環境中儲存資料到檔案中是一樣的。

public class FileActivity extends Activity {

    @Override public void onCreate(Bundle savedInstanceState) {

        ... 

         FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);

         outStream.write("傳智播客".getBytes());

         outStream.close();   

    }

}

openFileOutput()方法的第一引數用於指定檔名稱,不能包含路徑分隔符“/”,如果檔案不存在,會自動建立它。建立的檔案儲存在/data/data/<package name>/files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,通過點選Eclipse選單“Window”-“Show View”-“Other”,在對話視窗中展開android資料夾,選擇下面的File Explorer檢視,然後在File Explorer檢視中展開/data/data/<package name>/files目錄就可以看到該檔案。

openFileOutput()方法的第二引數用於指定操作模式,有四種模式,分別為:

Context.MODE_PRIVATE    = 0

Context.MODE_APPEND    = 32768

Context.MODE_WORLD_READABLE = 1

Context.MODE_WORLD_WRITEABLE = 2

Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容如果想把新寫入的內容追加到原檔案中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。

Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案。

MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。

如果希望檔案被其他應用讀和寫,可以傳入:

openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔案的時候,就需要userid匹配。預設情況下,任何應用建立的檔案,sharedpreferences資料庫都應該是私有的(位於/data/data/<package name>/files),其他程式無法訪問。除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。

如果要開啟存放在/data/data/<package name>/files目錄應用私有的檔案,可以使用Activity提供openFileInput()方法。

FileInputStream inStream = this.getContext().openFileInput("itcast.txt");

Log.i("FileTest", readInStream(inStream));

readInStream()的方法請看本頁下面備註。

或者直接使用檔案的絕對路徑:

File file = new File("/data/data/cn.itcast.action/files/itcast.txt");

FileInputStream inStream = new FileInputStream(file);

Log.i("FileTest", readInStream(inStream));

注意:上面檔案路徑中的“cn.itcast.action”為應用所在包,當你在編寫程式碼時應替換為你自己應用使用的包。

對於私有檔案只能被建立該檔案的應用訪問,如果希望檔案能被其他應用讀和寫,可以在建立檔案時,指定Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE許可權。

Activity還提供了getCacheDir()getFilesDir()方法:

getCacheDir()方法用於獲取/data/data/<package name>/cache目錄

getFilesDir()方法用於獲取/data/data/<package name>/files目錄