介紹
assets目錄(app_ame\module_name\src\main\assets)和raw目錄(app_ame\module_name\src\main\res\raw)下的資源只能讀取,不能寫入,資源文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制文件,可以存放音頻,視頻文件,文件的大小被限制在1M以下,推薦放入assets目錄下。
二者的不同點在於:
res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.raw.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。另外res/raw不可以有目錄結構,而assets則可以有目錄結構(在其目錄下可以再建文件夾)
讀取的方式
1.讀取res/raw下的文件資源,通過以下方式獲取輸入流:
InputStream is = getResources().openRawResource(R.raw.filename);
2.讀取assets下的文件資源,通過以下方式獲取輸入流:
InputStream is = getResources().getAssets().open("filename");
assets詳解
AssetManager類
提供對應用程序的原始資源文件進行訪問,這個類提供了一個低級別的API,它允許你以簡單的字節流的形式打開和讀取和應用程序綁定在一起的原始資源文件。通過getAssets()方法獲取AssetManager對象。
AssetManager類常用方法:
final String[] list(String path) //返回指定路徑下的所有文件及目錄名。
final InputStream open(String fileName) //使用 ACCESS_STREAMING模式打開assets下的指定文件。.
final InputStream open(String fileName, int accessMode) //使用顯示的訪問模式打開assets下的指定文件.
AssetFileDescriptor
在AssetManager中一項的文件描述符。這提供你自己打開的FileDescriptor可用於讀取的數據,以及在文件中的偏移量和長度的該項的數據。可以通過AssetManager的openFd()的方法獲取asset目錄下指定文件的AssetFileDescriptor對象。
AssetFileDescriptor常用方法:
FileInputStream createInputStream() //爲asset創建並返回一個自動關閉的輸入流。
FileOutputStream createOutputStream() //爲asset創建並返回一個自動關閉的輸出流。
FileDescriptor getFileDescriptor() //返回可用於讀取文件中的數據的FileDescriptor對象。
long getLength() //返回該asset中項的數據的總字節數。
long getStartOffset() //返回asset中項的數據字節開始偏移。
assets使用案例
將assets文件夾下的文件拷貝到/data/data/下
因爲assets文件夾下的文件只能讀,不能寫,而且有1M的限制,超過1M無法讀取,所以我們有時要把assets文件夾下的文件拷貝到/data/data/下然後操作文件。
/**
* 將assets文件夾下的文件拷貝到/data/data/下
*
* @param context
* @param fileName
*/
private void copyDbFile(Context context, String fileName) {
InputStream in = null;
FileOutputStream out = null;
String path = "/data/data/" + context.getPackageName() + "/audiofile/";
File file = new File(path + fileName);
//創建文件夾
File filePath = new File(path);
if (!filePath.exists())
filePath.mkdirs();
if (file.exists())
return;
try {
in = context.getAssets().open(fileName); // 從assets目錄下複製
out = new FileOutputStream(file);
int length = -1;
byte[] buf = new byte[1024];
while ((length = in.read(buf)) != -1) {
out.write(buf, 0, length);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) in.close();
if (out != null) out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
播放assets下的音樂
// 打開指定音樂文件,獲取assets目錄下指定文件的AssetFileDescriptor對象
AssetFileDescriptor afd = am.openFd(music);
mPlayer.reset();
// 使用MediaPlayer加載指定的聲音文件。
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
// 準備聲音
mPlayer.prepare();
// 播放
mPlayer.start();
END
本文參考: