Android复制res/raw目录的文件到SD卡下

Posted mufeng_慕枫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android复制res/raw目录的文件到SD卡下相关的知识,希望对你有一定的参考价值。

前言

       在应用开发中,我们会经常遇到操作工程中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卡下

以上是关于Android复制res/raw目录的文件到SD卡下的主要内容,如果未能解决你的问题,请参考以下文章

Android复制res/raw目录的文件到SD卡下

Android Video View - 无法从 SD 卡加载文件

AssetsUtils读取assetsres/raw./data/data/包名/目录下的文件

如何使用cordova插件挂钩将文件复制到/res/raw

Android - 如何使用新的存储访问框架将文件复制到外部 sd 卡

如何sqllite数据库复制到android手机上