android 內部檔案讀取
Android 檔案管理方法
Android使用的是基於Linux的檔案系統,對於檔案的訪問和管理是通過使用權限設定來限制的.
在Linux系統中,檔案許可權分別描述了建立者、同組使用者和其他使用者對檔案的操作限制。
x表示可執行,r表示可讀,w表示可寫,d表示目錄,-表示普通檔案。
產生這樣的檔案許可權與程式人員設定的
Android 隱藏檔的類型
(內部儲存)程式開發人員可以建立和訪問程式自身的私人檔案;
(資源儲存)可以訪問儲存在資來源目錄中的原始檔案和XML檔案;
(外部儲存)可以在SD卡等外部存放裝置中儲存檔案
Android系統允許應用程式建立僅能夠自身訪問的私人檔案,檔案儲存在裝置的內部儲存空間上,在Linux系統下的/data/data//files目錄中
Android系統不僅支援標準Java的IO類和方法,還提供了能夠簡化讀寫流式檔案過程的函數
FileOutputStream openFileOutput(String filename int mode)
FileInputStream openFileInput(String filename)
參數檔案不允許包含描述路徑的斜杠(其儲存位置固定)
訪問模式:
MODE_PRIVATE私人模式,缺陷模式,檔案僅能夠被檔案建立程式訪問,或具有相同UID的程式訪問。
MODE_APPEND追加模式,如果檔案已經存在,則在檔案的結尾處添加新資料。
MODE_WORLD_READABLE全域讀模式,允許任何程式讀取私人檔案。
MODE_WORLD_WRITEABLE全域寫入模式,允許任何程式寫入私人檔案。
三個基本的讀方法
abstract int read() :讀取一個位元組資料,並返回讀到的資料,如果返回-1,表示讀到了輸入資料流的末尾。
int read(byte[]b) :將資料讀入一個位元組數組,同時返回實際讀取的位元組數。如果返回-1,表示讀到了輸入資料流的末尾。
int read(byte[]b, intoff, intlen) :將資料讀入一個位元組數組,同時返回實際讀取的位元組數。如果返回-1,表示讀到了輸入資料流的末尾。off指定在數組b中存放資料的起始位移位置;len指定讀取的最大位元組數。
其它方法
long skip(longn) :在輸入資料流中跳過n個位元組,並返回實際跳過的位元組數。
int available() :返回在不發生阻塞的情況下,可讀取的位元組數。
void close() :關閉輸入資料流,釋放和這個流相關的系統資源。
void mark(intreadlimit) :在輸入資料流的當前位置放置一個標記,如果讀取的位元組數多於readlimit設定的值,則流忽略這個標記。
void reset() :返回到上一個標記。
boolean markSupported() :測試當前流是否支援mark和reset方法。如果支援,返回true,否則返回false。
三個基本的寫方法
abstract void write(intb) :往輸出資料流中寫入一個位元組。
void write(byte[]b) :往輸出資料流中寫入數組b中的所有位元組。
void write(byte[]b, intoff, intlen) :往輸出資料流中寫入數組b中從位移量off開始的len個位元組的資料。
其它方法
void flush() :重新整理輸出資料流,強制緩衝區中的輸出位元組被寫出。
void close() :關閉輸出資料流,釋放和這個流相關的系統資源。
對檔案和流的操作容易引發異常,所以必須要用try-catch語句
主要核心代碼
首先是建立一個檔案
private final String FILE_NAME = "Myfile01.txt";
寫檔案
FileOutputStream fos = null;//聲明一個全域變數
//注意下面的語句要進行拋異常處理FileNotFoundException e,IOException e
fos = openFileOutput(FILE_NAME,Context.MODE_PRIVATE);//寫流式檔案過程的
函數,這裡的許可權是私人的
String text = entryText.getText().toString();//把輸入的內容轉化為字串
fos.write(text.getBytes());//把轉化為字串的內容轉化為位元組,然後寫入
//下面語句寫在finally裡面
fos.flush();//把緩衝裡的內容寫入到檔案
fos.close();//關閉流
讀檔案
FileInputStream fis = null;//定義一個全域變數fis = openFileInput(FILE_NAME);//開啟要讀取的檔案if (fis.available() == 0){//判斷檔案是否為空白,為空白就直接返回 return;}byte[] readBytes = new byte[fis.available()];//把檔案裡的內容轉化為位元組while(fis.read(readBytes) != -1){//讀檔案,直到讀到最後}String text = new String(readBytes);//把讀到的位元組轉化為字串讀檔案的第二種方法
String path = "/data/data/cn.itcast.file/files/writeable.txt";//得到檔案路徑 File file = new File(path);//建立一個檔案對象 FileInputStream inStream = new FileInputStream(file);//讀檔案 byte[] buffer = new byte[1024];//緩衝 int len = 0; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); while( (len = inStream.read(buffer))!= -1){//直到讀到檔案結束 outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray();//得到檔案的位元據 outStream.close(); inStream.close(); Log.i(TAG, new String(data));