1. 程式人生 > >Android之assets資源目錄的各種操作

Android之assets資源目錄的各種操作

既然是要對assets資源目錄操作。首先來解釋下assets是啥?

Android 中資源分為兩種,

        ①、第一種是res下可編譯的資原始檔,這種資原始檔系統會在R.java裡面自動生成該資原始檔的ID,(除了raw外,其他資源目錄中的資原始檔都會被編譯),這也是為什麼將APK檔案解壓後無法直接檢視XML格式資原始檔內容的原因。而assets與res/raw目錄中的資原始檔不會做任何處理,所以將APK解壓後,這兩個目錄中的資原始檔都會保持原樣。res目錄只能有一層子目錄,而且這些子目錄必須是預定義的,如res/layout、res/values等都是合法的,而res/abc,res/xyz並不是合法的資源目錄。

        ②、第二種就是放在assets資料夾下面的原生資原始檔,放在這個資料夾下面的檔案不會被R檔案編譯,所以不能像第一種那樣直接使用.Android提供了一個工具類,方便我們操作獲取assets檔案下的檔案,在assets目錄中可以建任意層次的子目錄(只受作業系統的限制)。

接下來來點對assets實際的操作:

一、讀取assets下的txt檔案內容。

二、複製assets下資料夾中的檔案到手機的其它(新建或者已有資料夾)路徑中。

下面秀操作了(開始裝逼-哈哈):

一、讀取assets下的txt檔案內容:(寫成工具類,這樣呼叫起來就方便了)

//讀取本地JSON字元
    public static String ReadDayDayString(Context context) {
        InputStream is = null;
        String msg = null;
        try {
            is = context.getResources().getAssets().open("mprespons.txt");
            byte[] bytes = new byte[is.available()];
            is.read(bytes);
            msg = new String(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return msg;
    }

      上面程式碼中主要說下context.getResources().getAssets().open("xxx.txt");它是讀取assets下對應的檔案方法open()方法裡面傳對應開啟的檔案全名;

其它就是很簡單的Java-IO流的操作。非常簡單。

二、複製assets下資料夾中的檔案(同樣寫成工具類):

        首先我們要複製assets下資料夾中的檔案用上面的open("xxx.txt")方法肯定是不行了,你會想我用open("test\xx.txt")行不行。那你就想的太簡單了。事實告訴我們當然不行丟擲了IOException異常。不過好在Android 給了我們其他可執行的方法;

String[]listFiles=context.getAssets().list(rootDirFullPath);// 遍歷該目錄下的檔案和資料夾

rootDirFullPath傳的是空字串("")時獲取assets下全部檔案或資料夾名 可以看到返回了一個字串陣列。這樣我們就可以下一步操作了

public class Util {

    /**
     * 從assets目錄下拷貝整個資料夾,不管是資料夾還是檔案都能拷貝
     *
     * @param context           上下文
     * @param rootDirFullPath   檔案目錄,要拷貝的目錄如assets目錄下有一個tessdata資料夾:
     * @param targetDirFullPath 目標資料夾位置如:/Download/tessdata
     */
    public static void copyFolderFromAssets(Context context, String rootDirFullPath, String targetDirFullPath) {
        Log.d("Tag", "copyFolderFromAssets " + "rootDirFullPath-" + rootDirFullPath + " targetDirFullPath-" + targetDirFullPath);
        try {
            String[] listFiles = context.getAssets().list(rootDirFullPath);// 遍歷該目錄下的檔案和資料夾
            for (String string : listFiles) {// 判斷目錄是檔案還是資料夾,這裡只好用.做區分了
                Log.d("Tag", "name-" + rootDirFullPath + "/" + string);
                if (isFileByName(string)) {// 檔案
                    copyFileFromAssets(context, rootDirFullPath + "/" + string, targetDirFullPath + "/" + string);
                } else {// 資料夾
                    String childRootDirFullPath = rootDirFullPath + "/" + string;
                    String childTargetDirFullPath = targetDirFullPath + "/" + string;
                    new File(childTargetDirFullPath).mkdirs();
                    copyFolderFromAssets(context, childRootDirFullPath, childTargetDirFullPath);
                }
            }
        } catch (IOException e) {
            Log.d("Tag", "copyFolderFromAssets " + "IOException-" + e.getMessage());
            Log.d("Tag", "copyFolderFromAssets " + "IOException-" + e.getLocalizedMessage());
            e.printStackTrace();
        }
    }

    private static boolean isFileByName(String string) {
        if (string.contains(".")) {
            return true;
        }
        return false;
    }

    /**
     * 從assets目錄下拷貝檔案
     *
     * @param context            上下文
     * @param assetsFilePath     檔案的路徑名如:SBClock/0001cuteowl/cuteowl_dot.png
     * @param targetFileFullPath 目標檔案路徑如:/sdcard/SBClock/0001cuteowl/cuteowl_dot.png
     */
    public static void copyFileFromAssets(Context context, String assetsFilePath, String targetFileFullPath) {
        Log.d("Tag", "copyFileFromAssets ");
        InputStream assestsFileImputStream;
        try {
            assestsFileImputStream = context.getAssets().open(assetsFilePath);
            copyFile(assestsFileImputStream, targetFileFullPath);
        } catch (IOException e) {
            Log.d("Tag", "copyFileFromAssets " + "IOException-" + e.getMessage());
            e.printStackTrace();
        }
    }

    private static void copyFile(InputStream in, String targetPath) {
        try {
            FileOutputStream fos = new FileOutputStream(new File(targetPath));
            byte[] buffer = new byte[1024];
            int byteCount = 0;
            while ((byteCount = in.read(buffer)) != -1) {// 迴圈從輸入流讀取
                // buffer位元組
                fos.write(buffer, 0, byteCount);// 將讀取的輸入流寫入到輸出流
            }
            fos.flush();// 重新整理緩衝區
            in.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

當然我們在使用前可以加上一點判斷是否已經複製存在過:

   private void initAssets() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.e("Tag", "執行");
                File file = new File(File_Path);
                if (!file.exists()) {
                    Log.e("Tag", "建立資料夾");
                    file.mkdirs();
                }
                if (TextUtils.isEmpty(App.getSP().getString("iscopy"))) {
                    Log.e("Tag", "複製檔案");
                    Util.copyFolderFromAssets(MainActivity.this, "tessdata", File_Path);
                    App.getSP().put("iscopy", "true");
                }
            }
        }).start();
    }

來點git圖  專案結構圖: 複製assets下tessdata資料夾中的兩個檔案到Download下新建的tessdata資料夾中


   好了,小弟功力有限,希望對你有那麼一丟丟用。歡迎提出各種問題和指點。

最後附上小弟的github地址:github地址

相關推薦

Androidassets資源目錄各種操作

既然是要對assets資源目錄操作。首先來解釋下assets是啥? Android 中資源分為兩種,         ①、第一種是res下可編譯的資原始檔,這種資原始檔系統會在R.java裡面自動生成該資原始檔的ID,(除了raw外,其他資源目錄中的資原始檔都會被編譯)

Android多渠道打包且根據不同產品打包不同的assets資源目錄

因為專案中存在多種環境,既要區分bebug與release版本,release又要區分測試環境與生產上線環境,每次打包都得浪費不少的等待時間;並且哪個版本有問題還得去切換環境一個個打包,關鍵是還得牢記每次切換環境需要修改的內容,儘管每次都檢查仔細,但總有可能疏忽的時候,一旦有問題既浪費自己的時間又浪

android獲取assets資源

android獲取assets資源 1.載入assets目錄下的網頁 webView.loadUrl("file:///android_asset/Demo1/index.html"); 2.訪問assets目錄下的資原始檔 String name = "hallo.txt"

AndroidClipDrawable資源簡單使用

使用ClipDrawable實現圖片徐徐展開效果ClipDrawable 代表從其他點陣圖上擷取一個”圖片片段” 呼叫 setLevel(int level) 方法來設定擷取的區域大小 當level為0時,擷取的圖片片段為空; 當level為10000時,擷取整

從零開始學習RedisPHP使用Redis&各種操作例項

    開始在 PHP 中使用 Redis 前,我們需要確保已經安裝了 redis 服務及 PHP redis 驅動,且你的機器上能正常使用 PHP。其中安裝PHP redis 驅動的步驟我就不贅述了,

Android開發assets目錄資源使用總結

[] != 大致 pac 模式 uri bsp 文件夾 block 預前知識: Android資源文件分類: Android資源文件大致可以分為兩種: 第一種是res目錄下存放的可編譯的資源文件: 這種資源文件系統會在R

Android讀取assets目錄下的資源 (webview載入assets下的html)

1。獲取資源的輸入流 資原始檔 sample.txt 位於 $PROJECT_HOME/assets/ 目錄下,可以在 Activity 中通過 Context.getAssets().open(“sample.txt”) 方法獲取輸入流。 注意:如果資原始檔是文字檔案

Android讀取assets目錄下的資源

1。獲取資源的輸入流 資原始檔 sample.txt 位於 $PROJECT_HOME/assets/ 目錄下,可以在 Activity 中通過 Context.getAssets().open(“sample.txt”) 方法獲取輸入流。 注意:如果資原始檔是文字檔案

目錄基本操作mkdir命令

用戶 信息 version 上下文 mkdirmkdir命令主要用來創建目錄。語法 mkdir (選項) (參數)選項-Z 設置安全上下文,僅開啟SElinux時有效 -m <目標屬性>或--mode<目標屬性>建立目錄的同時設置目錄的權限 -p或--pa

Python文件操作:文件、目錄操作

繼續 不存在 write 表示 結構 src true 所在 txt 一、創建 1、創建文件 open(path,‘w‘) 2、創建目錄 (1)os.mkdir(pt[, mode=0777]) 新建一個目錄pt,參數mode表示生成的目錄的權限,默認是超級權限,也就是07

linux 下的文件目錄操作遍歷目錄

ges div strcmp pen fprintf pwd edi while font   通過遞歸調用讀取目錄和文件信息去遍歷整個目錄:   示例代碼: 1 #include <unistd.h> 2 #include <stdio.h>

PHP面試題文件目錄操作

als brush 文件名 func ram class png 後綴 extension 獲取文件後綴,遍歷目錄層次 /** * 5種方式獲取文件後綴名 * 這道題其實就是考函數substr() strrchr() array_pop() strrpos() str

python文件目錄操作

遍歷 pyc dem lists get light highlight 目錄 getc 代碼示例: 1 # 改變當前目錄操作 2 import os 3 4 cur = os.curdir 5 print("1、當前目錄相對路徑:", cur) 6 par

文佳夾操作獲取指定目錄下的所有文件及文件夾

IT foreach循環 each console line blog string ram tor 要想獲取當前文佳夾下所有文件,可通過Directory類的Getfiles方法來實現,此方法返回字符串數組 格式為: 用for循環輸出 class Program

Android獲取圖片資源 拍照後在程式中顯示照片

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux檔案及目錄許可權的相關操作

1.檔案許可權控制 首先我們先搞清一個問題:許可權存在的意義?  在我們的印象中檔案是用來存放實際資料的,目錄是用來存放檔案的,但其實目錄的主要作用是用來記錄檔名列表,檔名與目錄有強烈的關聯。許可權就是使用者或者其他人對這些目錄以及檔案能進行些什麼操作。 檔案的檢視 當我們建立

Android 採用execSQL和rawQuery方法完成資料的添刪改查操作

/*  Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作資料庫的API,使用該類可以完成對資料進行新增(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)。對SQLiteData

Android開發多執行緒的操作方式Thread,TimerTask,AsyncTask

雨鬆MOMO原創文章如轉載,請註明:轉載至我的獨立域名部落格雨鬆MOMO程式研究院,原文地址:http://www.xuanyusong.com/archives/344 Android研究院之遊戲開發多執行緒(十六)   遊戲開發與軟體開發多執行緒的重要性  &

Android UI詳解顏色資源的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

elasticsearch-java api文件(document)各種操作

使用java api和es互動時,可以是json字串、map物件;es中內建Jackson json序列化機制,可以將自定義物件轉成string或者byte,然後傳給es-java api使用。 1、新增document: public static bool