Android使用文件進行數據存儲

一、Context.MODE_PRIVATE:爲默認操做模式,表明該文件時私有數據,只能被應用自己訪問,在該模式下,寫入的內容會覆蓋文件的內容,若是想把新寫入的內容追加到原文件中,可使用Context.,MODE_APPEND。 java

 

package org.example.service; android

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream; 數據庫

import android.content.Context; 數組

public class FileService {
 
  /**
   * (文件的IO技術)提供上下文對象
   */
  private Context context;
 
  /**
   * 經過構造器給context賦值
   */
 
  public FileService(Context context) {
   this.context = context;
  }
  /**
   * 保存文件
   * @param filename 文件名稱
   * @param content 文件內容
   */
  public void save(String filename, String content) throws Exception {
  
   /*
    * 一、根據上下文對象能快速獲得一個文件輸出流對象;
    * 二、私有操做模式:建立出來的文件只能被本應用訪問,其餘應用沒法訪問該文件:Context.MODE_PRIVATE;
    * 另外採用私有操做模式建立的文件,寫入的內容會覆蓋原文件的內容。
    * 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
    * Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
    */
   FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_PRIVATE);
   //把字符串傳化爲二進制數據寫入到文件中
   outStream.write(content.getBytes());
   //而後關掉這個流
   outStream.close();
  
  
  }
 
  /**
   * 讀取文件內容
   * @param filename 文件名稱
   * @return 文件內容
   * @throws Exception
   */
  public String read(String filename) throws Exception
  {
   /*
    * 一、從上下文對象中獲得一個文件輸入流對像,context.openFileInput(filename)獲得文件輸入流對象;
    * 二、
    */
   FileInputStream inStream = context.openFileInput(filename);
   //把每次讀到的數據都存放在內存中
   ByteArrayOutputStream outStream = new ByteArrayOutputStream();
   //定義數組大小
   byte[] buffer = new byte[1024];
   int len = 0;
   //讀取這個輸入流數組,判斷數據是否讀完
   while((len = inStream.read(buffer)) != -1)
   {
    outStream.write(buffer,0,len);
   }
   //從內存中獲取獲得的數據
   byte[] data = outStream.toByteArray();
   //轉化爲字符
   return new String(data);
  } 安全

} this

二、Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,不然就建立新文件。 .net

 /**
     * 使用追加模式保存文件
     * @param filename
     * @param content
     * @throws Exception
     */
 public void saveAppend(String filename, String content) throws Exception {
  
  /*
   * 一、根據上下文對象能快速獲得一個文件輸出流對象;
   * 二、追加操做模式:建立出來的文件只能被本應用訪問,其餘應用沒法訪問該文件:Context.MODE_PRIVATE;
   * 另外採用追加操做模式建立的文件,先會檢查文件是否存在,存在就往文件追加內容,不然就建立新文件。
   * 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
   * Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_APPEND);
   //把字符串傳化爲二進制數據寫入到文件中
   outStream.write(content.getBytes());
   //而後關掉這個流
   outStream.close();  
  
 } 對象

三、Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其餘應用是否有權限讀寫該文件。 內存

1)MODE_WORLD_TEADABLE:表示當前文件能夠被其餘應用讀取。 資源

/**
     * 使用READABLE建立文件
     * @param filename
     * @param content
     * @throws Exception
     */
 public void saveReadable(String filename, String content) throws Exception {
  
  /*
   * 一、根據上下文對象能快速獲得一個文件輸出流對象;
   * 二、MODE_WORLD_TEADABLE:表示當前文件能夠被其餘應用讀取,建立的文件,寫入的內容會覆蓋原文件的內容。
   * 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
   * Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_READABLE);
 //把字符串傳化爲二進制數據寫入到文件中
   outStream.write(content.getBytes());
   //而後關掉這個流
   outStream.close();   
  
 }

2)MODE_WORLD_WTITEABLE:表示當前文件能夠被其餘應用寫入,但不能讀取其數據。

/**
     * 使用WRITEABLE建立文件
     * @param filename
     * @param content
     * @throws Exception
     */
 public void saveWriteable(String filename, String content) throws Exception {
  
  /*
   * 一、根據上下文對象能快速獲得一個文件輸出流對象;
   * 二、MODE_WORLD_WRITEABLE:表示當前文件能夠被其餘應用寫入,建立的文件,寫入的內容會覆蓋原文件的內容。
   * 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
   * Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_WRITEABLE);
  //把字符串傳化爲二進制數據寫入到文件中
   outStream.write(content.getBytes());
   //而後關掉這個流
   outStream.close();   
  
 }
 

四、若是但願文件被其餘應用讀和寫,能夠傳入:

openFileOutput("hello.txt",Context.MODE_WORLE_TEADABLE + Context.MODE_WOTLD_WRITEABLE);

/**
  * 建立可以進行讀和寫的文件
  * @param filename
  * @param content
  * @throws Exception
  */
    public void saveRW(String filename, String content) throws Exception {
  
  /*
   * 一、根據上下文對象能快速獲得一個文件輸出流對象;
   * 二、Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE:表示當前文件能夠被其餘應用讀寫和寫入,建立的文件,寫入的內容會覆蓋原文件的內容。
   * 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
   * Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
  //把字符串傳化爲二進制數據寫入到文件中
   outStream.write(content.getBytes());
   //而後關掉這個流
   outStream.close();    
    }

五、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("hello.txt");

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

或者直接使用文件的絕對路徑:

File file = new File("/data/data//data/data/org.example.files/files.txt");

FileInputStream inStream = new FileInputStream(file);

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

注意:上面文件路徑中"org.example.files"爲應用所在包,當你在編寫代碼時應替換爲你本身應用使用的包。

對於私有文件只能被建立該文件的應用訪問,若是但願文件能被其餘應用讀和寫,能夠在建立文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WRITEABLE權限。

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

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

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

相關文章
相關標籤/搜索