以下均轉自Android遊戲編程入門經典,轉載請標明出處遊戲編程肯定不光只是用手機記憶體還要訪問外部儲存空間,主要是訪問SD卡。先從讀取資源檔開始。
我們知道assets/和res/檔案夾用於存放可在應用程式中的使用檔案。
assets/用於儲存各種應用程式中需要的檔案(例如設定檔或音頻檔案等),這些檔案會打包在Android應用程式中。
res/包含應用程式所需的各種資源檔,如icons、用於國際化的字串檔案和用於介面布局的XML檔案。它們同樣打包於應用檔案中。
在這裡我們不使用res/檔案夾,因為它對我們構造檔案集存在限制。而assets/目錄才是我們存放的地方,無論如何階層的檔案夾都可以。
Assets/檔案夾中的檔案通過一個AssetManager類顯示出來,我們可以在應用程式中引用該管理器,如下所示:
AssetManager assetManager = context.getAssets();
一旦我們得到AssetManager,就可以容易地開啟檔案:
InputStream inputStream = assetManager.open("dir/dir2/filename.txt");
該方法將返回一個普通Java輸入資料流InputStream,通過它我們可以讀取任何類型的檔案。AssetManager.open()方法的唯一參數是相對於asset目錄的檔案名稱,如果路徑為dir/dir2/filename.txt,那麼在Eclipse裡就是assets/dir/dir2/filename.txt。
現在我們從assets/目錄下的一個texts子目錄來載入txt檔案並將其顯示在TextView中。
代碼如下:
package org.example.ch04_android_basics;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import android.app.Activity;import android.content.res.AssetManager;import android.os.Bundle;import android.widget.TextView;public class AssetsTest extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);TextView textView = new TextView(this);setContentView(textView);AssetManager assetManager = getAssets();InputStream inputStream = null;try{inputStream = assetManager.open("texts/myawesometext.txt");String text = loadTextFile(inputStream);textView.setText(text);}catch(IOException e){textView.setText("Couldn't load file");}finally{if(inputStream != null)try{inputStream.close();}catch(IOException e){textView.setText("Couldn't close file");}}}public String loadTextFile(InputStream inputStream) throws IOException{ByteArrayOutputStream byteStream = new ByteArrayOutputStream();byte[] bytes = new byte[4096];int len = 0;while((len = inputStream.read(bytes)) > 0)byteStream.write(bytes, 0, len);return new String(byteStream.toByteArray(), "UTF-8");}}
運行效果如下:
這裡用了一個小方法loadTextFile(),用於從InputStream中讀取所有位元組並將所有位元組轉換成字串返回,並採用UTF-8編碼。
接下來該訪問外部隱藏檔了,有時候我們需要持久儲存一些資訊並在隨後重新載入它們。
首先要做的是請求實際訪問外部儲存空間的許可權,需要在資訊清單檔的<uses-permission>元素中添加該許可權,關於這些許可權可以參考Android遊戲編程Manifest檔案準備,接下來我們需要檢查一下所用裝置是否存在有用的外部儲存空間。
String state = Environment.getExternalStorageState();
我們得到一個字串。Environment類中定義了很多常量,其中一個叫Environment.MEDIA_MOUNTED,它也是一個字串。如果返回的字串等於該常量,我們就具有讀寫外部儲存空間的全部許可權。注意這裡需要用equals()方法來比較這兩個字串,而引用等式在任何情況下是無法工作的。關於String使用equals()方法和==的區別可以參考。
一旦我們確定可以訪問外部儲存空間,就需要擷取其根目錄的名稱。如果我們想訪問一個特定的檔案,就需要相對於根目錄去指定它。
File externalDir = Environment.getExternalStorageDirectory(); 擷取根目錄
現在可以在SD卡上寫入一個檔案,並把它讀出來顯示在TextView上了,然後再將該檔案刪除,代碼如下:
package org.example.ch04_android_basics;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.widget.TextView;public class ExternalStorageTest extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);TextView textView = new TextView(this);setContentView(textView);String state = Environment.getExternalStorageState();if(!state.equals(Environment.MEDIA_MOUNTED)){textView.setText("No external storage mounted");}else{File externalDir = Environment.getExternalStorageDirectory();File textFile = new File(externalDir.getAbsolutePath()+ File.separator + "text.txt");try{writeTextFile(textFile, "This is test. Roger");String text = readTextFile(textFile);textView.setText(text);if(!textFile.delete()){textView.setText("Couldn't remove temporary file");}}catch(IOException e){textView.setText("Something went wrong! " + e.getMessage());}}}private void writeTextFile(File file, String text) throws IOException{BufferedWriter writer = new BufferedWriter(new FileWriter(file));writer.write(text);writer.close();}private String readTextFile(File file) throws IOException{BufferedReader reader = new BufferedReader(new FileReader(file));StringBuilder text = new StringBuilder();String line;while((line = reader.readLine()) != null){text.append(line);text.append("\n");}reader.close();return text.toString();}}
運行效果如下:
從這裡我們可以看出,我們很容易刪除外部裝置上的所有檔案,因此從安卓市場下載並安裝那些需要SD卡許可權的應用程式時,一定要三思而後行。一旦安裝了該應用程式,它將能完全控制你的檔案