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地址

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆流的剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值