Android assets 和 res/raw 區別。讀取本地網頁,讀取文本字體樣式,讀取視頻。
res/raw和assets的相同點:
1.兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。
1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
raw是Resources (res)的子目錄,Android會自動的爲這目錄中的所有資源文件生成一個ID,這個ID會被存儲在R類當中,作爲一個文件的引用。這意味着這個資源 文件可以很容易的被Android的類和方法訪問到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是訪問一個文件最快捷的方式。MP3和Ogg文件放在這個目錄下是比較合適
的.
assets: 無法在Android XML文件中引用到assets目錄下的文件,只能通過AssetManager來訪問這些文件。數據庫文件和遊戲數據等放在這個目錄下是比較合適的。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾.
讀取文件資源:
一、讀取 res/raw文件
第一個測試:序列化和反序列化文件讀取
try {
// 測試序列化數據到文件
// 第一步先在手機緩存目錄生成一個序列化對象的文件
// 然後將手機中生成的文件拷貝到項目res/raw 中做測試
// 第二步用ObjectInputStream 反序列化讀取對象
// 創建一個對象
Person people = new Person("張三", "男");
// 實例化ObjectOutputStream對象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(MainActivity.this.getExternalCacheDir().getPath() + "/person.text"));
// 將對象寫入文件
oos.writeObject(people);
oos.flush();
oos.close();
// 實例化ObjectInputStream對象
//讀取raw文件的方法openRawResource。
InputStream is = getResources().openRawResource(R.raw.person);
ObjectInputStream ois = new ObjectInputStream(is);
try {
// 讀取對象people,反序列化
Person p = (Person) ois.readObject();
System.out.println("姓名:" + p.getName());
System.out.println("性別:" + p.getSex());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
在SDK緩存目錄下生成一個person.text 的序列化文件
將其拷貝到項目res/raw 中做測試
注意:生成序列化文件和反序列化時,必須保持Person 類沒有變化,比如包名,序列化id。都要保持一致。否則反序列化會報錯。
public class Person implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
從raw中讀取文件,生成InputStream 流
//讀取raw文件的方法openRawResource。
InputStream is = getResources().openRawResource(R.raw.person);
第二個測試:讀取一個普通文件測試
代碼如下:
//另外一個測試。讀取test.text 文件
BufferedReader bufReader = null;
InputStreamReader isr = null;
try {
InputStream is = getResources().openRawResource(R.raw.test);
isr = new InputStreamReader(is);
bufReader = new BufferedReader(isr);
String message = "";
String line = null;
while ((line = bufReader.readLine()) != null) {
message += line;
}
System.out.println("message======" + message);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
二、讀取assets文件夾下文件:
public void OpenFileAssets(View v) {
AssetManager am = null;
am = getAssets();
InputStream is = null;
try {
is = am.open("person.text");
} catch (IOException e) {
e.printStackTrace();
}
try {
ObjectInputStream ois = new ObjectInputStream(is);
try {
// 讀取對象people,反序列化
Person p = (Person) ois.readObject();
System.out.println("姓名:" + p.getName());
System.out.println("性別:" + p.getSex());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
關鍵讀取文件的方法:生成InputStream
AssetManager am = null;
am = getAssets();
InputStream is = null;
try {
is = am.open("person.text");
} catch (IOException e) {
e.printStackTrace();
}
三、將字體樣式文件放在 assets 中讀取使用:
public void OpenFont(View v) {
AssetManager am = getAssets();// 得到AssetManager
Typeface tf = Typeface.createFromAsset(am, "font/aaa.ttf");// 根據路徑得到Typeface。注意文件夾名稱。文件名要帶文件類型
vFontText.setTypeface(tf);// 設置字體
}
注意文件目錄,不用寫assets,因爲方法名就是createFromAsset 。
Typeface 還有如下方法,可能不支持放在raw下讀取,沒有測試。
四、加載本地Html網頁,放在assets中讀取。方法如下。
vWebView.loadUrl("file:///android_asset/webview_error.html");
五、讀取項目中的 聲音和視頻文件,要放在raw 中讀取。
播放視頻文件
vVideoView.setVideoURI(Uri.parse("android.resource://" + "com.example.maintest" + "/" + R.raw.movie));
vVideoView.start();
其中 com.example.maintest 項目包名。不要忘記調用start()方法播放視頻。
注意:
播放項目工程裏面的視頻文件,不是播放SD卡視頻文件。
開始嘗試把視頻文件放到 assets文件目錄下。
模仿WebView 加載assets 下的Html文件。
我嘗試將視頻movie.mp4 放到assets目錄下.。
結果報錯了,無法播放。
播放Android項目工程裏的視頻文件最終解決辦法是:
1. 把視頻文件放到項目工程的 res/raw 文件下。
2.視頻文件必須是Android支持視頻格式(3gp,wmv,mp4),並且命名必須是小寫字母,數據,下劃線,例如:my_video_file.mp4
3. 當你是在代碼裏面引用這個資源文件時,你必須使用Rstatics類,同時去掉文件的後綴:R.raw.my_video_file
4. 構造正確的URI