Android資料儲存(二)File 資料內部儲存
Java提供了一套完整的IO流體系,用來對檔案進行操作。Android同樣支援以這種方式來訪問手機儲存器上的檔案,包括內部儲存器和外部儲存器
Android中可以在裝置本身的儲存裝置或者外接的儲存裝置中建立用於儲存資料的檔案。預設情況下,檔案是不能在不同的程式間共享的。當該應用程式解除安裝時,這些檔案將被刪除掉。
二、File 資料內部儲存
1、在應用程式的私有資料夾(data/data/包名)下儲存檔案
因為根據包名的標誌建立的資料夾,所以稱為該應用程式的私有資料夾。這樣的儲存有兩種方式:
第一種方式 類似於Java平臺下的實現方式,直接根據data/data/包名 路徑操作IO流來儲存資料。
第二種方式,使用Context提供的方法來直接操作
第一種方式和Java平臺下的基本一樣,不多說,看下第二種方式。
①、在內部儲存器中的私有資料夾中建立一個檔案寫入資料:
1、根據檔名字和操作模式,呼叫openFileoutput()方法,返回一個FileOutputStream流
2、呼叫write()方法,向檔案寫資料
3、呼叫close()方法關閉流
例子:
String FILENAME ="hello_file";Stringstring="hello world!";FileOutputStream fos = openFileOutput(FILENAME,Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close();
第二個引數為操作模式,有四種:
Context.MODE_PRIVATE = 0 為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可以使用Context.MODE_APPEND
Context.MODE_APPEND = 32768 模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。
Context.MODE_WORLD_READABLE = 1 表示當前檔案可以被其他應用讀取
Context.MODE_WORLD_WRITEABLE = 2 表示當前檔案可以被其他應用寫入
②、從內部儲存器讀取一個檔案:
1、呼叫openFileInput()方法,指定檔案的名字,返回一個FileInputStream流
2、呼叫read()方法讀取資料
3、呼叫close()方法關閉流
例子:
public class InteralFile_Activity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
//建立一個檔案,寫入資料
FileOutputStream outputStream=openFileOutput("test.txt", MODE_PRIVATE);
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(outputStream));
writer.write("12123");
writer.close();
//讀取資料
FileInputStream inputStream=openFileInput("test.txt");
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
String line=reader.readLine();
Log.i("Test", line);
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
③、另外一些Context提供的操作方法:
我們通過openFileInput和openFileOutout建立和讀取的檔案在應用程式中有一個固定的位置:
File Explorer / data /data / 包名 /files /檔名
我們知道在Java IO流中,可以自己去手動建立一個檔案,在Android中同樣可以。只要我們能確定內部儲存器的路徑,就可以自己去建立和讀取我們自己的檔案。
Android提供了幾個方法,用來完成我們自己的操作:
1、getFilesDir()
根據這個方法,我們可以得到內部儲存器檔案系統目錄的絕對路徑 就是data /data / 包名 /files
當然也可以直接使用絕對路徑,比如:
File file = new File("/data/data/cn.itcast.action/files/itcast.txt");
2、getDir() 在內部儲存器中建立(或者開啟一個已經存在的)資料夾
3、deleteFile() 刪除一個私有資料夾下的檔案(即files目錄下的檔案,該方法指定檔名直接刪除)
4、fileList() 返回私有資料夾下面所有檔案,以字串陣列的形式返回。
④、儲存快取檔案
如果你想快取一些資料,而不是持久的儲存它,你應該使用getCacheDir()來開啟一個檔案,它代表應用程式儲存臨時快取檔案的內部目錄。
當裝置記憶體不足時,Android系統可能刪除這些快取檔案來恢復空間。但是,您不應該依賴於系統來清理這些檔案。你應該自己處理這些快取檔案,保持在合理限度的空間消耗,如1 mb。當用戶解除安裝應用程式時,這些檔案被刪除。
2、讀取工程中Resources和Assets中的檔案
在Android中,除了對應用程式私有資料夾中的檔案進行操作之外,還可以從資原始檔和Assets中獲得輸入流讀取資料。這些檔案分別存放在應用程式的res/raw目錄和assets目錄下。這些檔案將在編譯的時候和其他檔案一起打包進APK中。
注意,這兩個資料夾下的檔案只能進行讀操作,不能進行寫操作。
①、res/raw下的檔案操作:
通過Context的方法獲得
try {
InputStream inputStream1=getResources().openRawResource(R.raw.test);//獲取輸入流
byte[] buffer1=new byte[256];
inputStream1.read(buffer1);
Log.i("Test", new String(buffer1).trim());
inputStream1.close();
} catch (IOException e) {
e.printStackTrace();
}
通過Uri的方式獲得
Uri uri=Uri.parse("android.resource://" + getPackageName() + "/"+R.raw.test);
②、assets目錄下的檔案操作:
try {
InputStream inputStream3=getAssets().open("test.txt");
byte[] buffer2=new byte[256];
inputStream3.read(buffer2);
Log.i("Test", new String(buffer2).trim());
inputStream3.close();
} catch (IOException e) {
e.printStackTrace();
}
還可以通過AssetManager的list方法得到檔案的文字,再去開啟輸入流
try {
String[] str=getAssets().list("");
for(String s:str) //得到檔案的名字,可以用來開啟輸入流
Log.i("Test", s);
} catch (IOException e) {
e.printStackTrace();
}