Android复制resraw目录的文件到SD卡下

    xiaoxiao2021-03-25  55

    前言

           在应用开发中,我们会经常遇到操作工程中assets和res/raw目录下的文件,那么这两个目录有什么用呢?assets和res/raw工程目录下都可以存放一些小于1M(2.3版本以前要求,否则将不能读出数据。),这些文件将被打包到APK中供应用使用。assets目录下的文件将不做任何处理被打包,而res/raw目录下的文件,有些文档说会编译为二进制,有些文档说不会。有一个原则就是最好不要将过大的文件打包到APK中,如果你的资源很大,例如视频文件等等,应该单独存储在文件系统中。       assets和res/raw目录的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。     res/raw和assets的不同点: res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源id即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。

    目录结构图

    复制res/raw目录的文件到指定目录

    private static final String SEPARATOR = File.separator;//路径分隔符 /** * 复制res/raw中的文件到指定目录 * @param context 上下文 * @param id 资源ID * @param fileName 文件名 * @param storagePath 目标文件夹的路径 */ public static void copyFilesFromRaw(Context context, int id, String fileName,String storagePath){ InputStream inputStream=context.getResources().openRawResource(id); File file = new File(storagePath); if (!file.exists()) {//如果文件夹不存在,则创建新的文件夹 file.mkdirs(); } readInputStream(storagePath + SEPARATOR + fileName, inputStream); } /** * 读取输入流中的数据写入输出流 * * @param storagePath 目标文件路径 * @param inputStream 输入流 */ public static void readInputStream(String storagePath, InputStream inputStream) { File file = new File(storagePath); try { if (!file.exists()) { // 1.建立通道对象 FileOutputStream fos = new FileOutputStream(file); // 2.定义存储空间 byte[] buffer = new byte[inputStream.available()]; // 3.开始读文件 int lenght = 0; while ((lenght = inputStream.read(buffer)) != -1) {// 循环从输入流读取buffer字节 // 将Buffer中的数据写到outputStream对象中 fos.write(buffer, 0, lenght); } fos.flush();// 刷新缓冲区 // 4.关闭流 fos.close(); inputStream.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 在需要的地方调用以上源码 FileStorageHelper.copyFilesFromRaw(this,R.raw.doc_test,"doc_test",path + "/" + "mufeng");

    复制asset目录的文件到SD卡下

    参考: Android复制asset目录的文件到SD卡下
    转载请注明原文地址: https://ju.6miu.com/read-35674.html

    最新回复(0)