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

Posted mufeng_慕枫

tags:

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

package com.mufeng.toolproject.utils;

import android.content.Context;
import android.content.res.AssetManager;
import android.text.TextUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by mufeng on 2017/3/12.
 */
public class FileStorageHelper 
    private static final String SEPARATOR = File.separator;//路径分隔符

    /**
     * 复制assets中的文件到指定目录
     *
     * @param context     上下文
     * @param assetsPath  assets资源路径
     * @param storagePath 目标文件夹的路径
     */
    public static void copyFilesFromAssets(Context context, String assetsPath, String storagePath) 
        String temp = "";

        if (TextUtils.isEmpty(storagePath)) 
            return;
         else if (storagePath.endsWith(SEPARATOR)) 
            storagePath = storagePath.substring(0, storagePath.length() - 1);
        

        if (TextUtils.isEmpty(assetsPath) || assetsPath.equals(SEPARATOR)) 
            assetsPath = "";
         else if (assetsPath.endsWith(SEPARATOR)) 
            assetsPath = assetsPath.substring(0, assetsPath.length() - 1);
        

        AssetManager assetManager = context.getAssets();
        try 
            File file = new File(storagePath);
            if (!file.exists()) //如果文件夹不存在,则创建新的文件夹
                file.mkdirs();
            

            // 获取assets目录下的所有文件及目录名
            String[] fileNames = assetManager.list(assetsPath);
            if (fileNames.length > 0) //如果是目录 apk
                for (String fileName : fileNames) 
                    if (!TextUtils.isEmpty(assetsPath)) 
                        temp = assetsPath + SEPARATOR + fileName;//补全assets资源路径
                    

                    String[] childFileNames = assetManager.list(temp);
                    if (!TextUtils.isEmpty(temp) && childFileNames.length > 0) //判断是文件还是文件夹:如果是文件夹
                        copyFilesFromAssets(context, temp, storagePath + SEPARATOR + fileName);
                     else //如果是文件
                        InputStream inputStream = assetManager.open(temp);
                        readInputStream(storagePath + SEPARATOR + fileName, inputStream);
                    
                
             else //如果是文件 doc_test.txt或者apk/app_test.apk
                InputStream inputStream = assetManager.open(assetsPath);
                if (assetsPath.contains(SEPARATOR)) //apk/app_test.apk
                    assetsPath = assetsPath.substring(assetsPath.lastIndexOf(SEPARATOR), assetsPath.length());
                
                readInputStream(storagePath + SEPARATOR + assetsPath, inputStream);
            
         catch (IOException e) 
            e.printStackTrace();
        

    

    /**
     * 读取输入流中的数据写入输出流
     *
     * @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.copyFilesFromAssets(this, "doc_test.txt", path + "/" + "a_mufeng");
//        FileStorageHelper.copyFilesFromAssets(this, "apk", path + "/" + "a_mufeng");
//        FileStorageHelper.copyFilesFromAssets(this, "apk/app_test.apk", path + "/" + "a_mufeng");

assets的目录结构


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

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

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

Android程序函数 将assets文件夹下的文件复制到手机的sd卡中(包括子文件夹)

android 修改apk的asset目录后怎么安装

Android读取assets目录下的视屏资源

将目录和文件从 res/raw 文件夹复制到 sd 卡 - android