Android中讀取assets目錄下的檔案詳細介紹

風靈使發表於2018-10-30

前言

Android 中資源分為兩種,
一種是res下可編譯的資原始檔, 這種資原始檔系統會在R.java裡面自動生成該資原始檔的ID,訪問也很簡單,只需要呼叫R.XXX.id即可;
第二種就是放在assets資料夾下面的原生資原始檔,放在這個資料夾下面的檔案不會被R檔案編譯,所以不能像第一種那樣直接使用.Android提供了一個工具類,方便我們操作獲取assets檔案下的檔案:AssetManager

AssetManager

AssetManager提供瞭如下方法用於處理assets

    String[] list(String path);//列出該目錄下的下級檔案和資料夾名稱

    InputStream open(String fileName);//以順序讀取模式開啟檔案,預設模式為ACCESS_STREAMING

     InputStream open(String fileName, int accessMode);//以指定模式開啟檔案。讀取模式有以下幾種:
                                        //ACCESS_UNKNOWN : 未指定具體的讀取模式
                                        //ACCESS_RANDOM : 隨機讀取
                                        //ACCESS_STREAMING : 順序讀取
                                        //ACCESS_BUFFER : 快取讀取
    void close()//關閉AssetManager例項

使用

assets目錄下主要存放四種檔案:文字檔案、影象檔案、網頁檔案(包括html中引用的js/ccs/jpg等資源)、音訊視訊檔案,下面通過具體的案例分別來說下怎麼獲取

載入assets目錄下的網頁

webView.loadUrl("file:///android_asset/html/index.html");

說明:這種方式可以載入assets目錄下的網頁,並且與網頁有關的css,js,圖片等檔案也會的載入。

載入assets目錄下的圖片資源

InputStream is = getAssets().open(fileName);  
bitmap = BitmapFactory.decodeStream(is); 
ivImg.setImageBitmap(bitmap); 

載入assets目錄下文字檔案

 InputStream is = getAssets().open(fileName);  
 int lenght = is.available();  
 byte[]  buffer = new byte[lenght];  
 is.read(buffer);  
 String result = = new String(buffer, "utf8");  

載入assets目錄下音樂

// 開啟指定音樂檔案,獲取assets目錄下指定檔案的AssetFileDescriptor物件  
AssetFileDescriptor afd = am.openFd(music);  
mPlayer.reset();  
// 使用MediaPlayer載入指定的聲音檔案。  
mPlayer.setDataSource(afd.getFileDescriptor(),  
    afd.getStartOffset(), afd.getLength());  
// 準備聲音  
mPlayer.prepare();  
// 播放  
mPlayer.start(); 

補充下:Android中還有另外一個資料夾raw,和assets差不多,也不會被R檔案編譯,但是raw下不能在建資料夾,assets檔案下是可以在建資料夾的,下面是獲取raw資料夾下資源的方法:

InputStream is = getResources().openRawResource(R.id.filename); 

assets下的檔案複製到SD卡中

程式碼取自網上

/**  
 *  從assets目錄中複製整個資料夾內容  
 *  @param  context  Context 使用CopyFiles類的Activity 
 *  @param  oldPath  String  原檔案路徑  如:/aa  
 *  @param  newPath  String  複製後路徑  如:xx:/bb/cc  
 */   
public void copyFilesFassets(Context context,String oldPath,String newPath) {                      
         try {  
        String fileNames[] = context.getAssets().list(oldPath);//獲取assets目錄下的所有檔案及目錄名  
        if (fileNames.length > 0) {//如果是目錄  
            File file = new File(newPath);  
            file.mkdirs();//如果資料夾不存在,則遞迴  
            for (String fileName : fileNames) {  
               copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);  
            }  
        } else {//如果是檔案  
            InputStream is = context.getAssets().open(oldPath);  
            FileOutputStream fos = new FileOutputStream(new File(newPath));  
            byte[] buffer = new byte[1024];  
            int byteCount=0;                 
            while((byteCount=is.read(buffer))!=-1) {//迴圈從輸入流讀取 buffer位元組          
                fos.write(buffer, 0, byteCount);//將讀取的輸入流寫入到輸出流  
            }  
            fos.flush();//重新整理緩衝區  
            is.close();  
            fos.close();  
        }  
    } catch (Exception e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
        //如果捕捉到錯誤則通知UI執行緒  
                   MainActivity.handler.sendEmptyMessage(COPY_FALSE);  
    }                             
}  

例項效果圖
在這裡插入圖片描述

相關文章