Android assets 和 res/raw 區別。讀取本地網頁,讀取文本字體樣式,讀取視頻。

Android assets 和 res/raw 區別。讀取本地網頁,讀取文本字體樣式,讀取視頻。


res/raw和assets的相同點:

1.兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。


res/raw和assets的不同點:

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


源碼

發佈了88 篇原創文章 · 獲贊 40 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章