Android 递归实现assets拷贝到sd卡

来源:互联网 发布:北航网络教育官网 编辑:程序博客网 时间:2024/05/16 09:46
直接开始正文吧。。。。

效果如下:

先来看看资产目录。


首先要添加权限,这是毋庸置疑的。。。



layout布局文件,这就没什么看的了,就两个按钮。
下面是一些初始化的操作。。。



剩下的就不做介绍了,直接贴代码,例子也是比较简单。。。
package com.itxwy.a28_jsoupdemo;import android.content.Context;import android.content.res.AssetManager;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private Context mContext = null;//获得上下文    private String mSDCardUrl = null;//sd卡的路径    private AssetManager mAm = null;//资产目录管理器    private String mIconFont = "iconfont";//资产目录地址    private Button mCopyBtn = null,mDelBtn = null;//拷贝按钮,删除按钮    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init(){        this.mContext = this;        mSDCardUrl = Environment.getExternalStorageDirectory().toString();//拿到SD卡的路径        mAm = getAssets();//初始化资产目录管理器        mCopyBtn = (Button) findViewById(R.id.id_file_copy);        mDelBtn = (Button) findViewById(R.id.id_file_del);        mCopyBtn.setOnClickListener(this);        mDelBtn.setOnClickListener(this);        //创建跟目录        mSDCardUrl = mSDCardUrl+"/"+"iconfont";        File file = new File(mSDCardUrl);        if(!file.exists()){            file.mkdir();        }    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.id_file_copy:{                getAssetToSD(mSDCardUrl,mIconFont);                break;            }            case R.id.id_file_del:{                delFile(mSDCardUrl);                break;            }            default:{                Toast.makeText(mContext,"执行错误",Toast.LENGTH_LONG).show();                break;            }        }    }    /**     * 。。。     * @param url  SD卡路径     * @param assetsName  资产目录的文件夹名称     */    private void getAssetToSD(String url,String assetsName){        try {            String[] fileContents = mAm.list(assetsName);            for (int i = 0; i <fileContents.length ; i++) {                if(mAm.list(assetsName+"/"+fileContents[i]).length>0){//如果大于0 则证明这是个文件夹                    copyFolderToSD(fileContents[i],url);                    //当然,这里进入到子文件夹,那么,我们就需要检查这个子文件夹中是否有需要拷贝的文件,就需要调用当前的方法                    //递归。。。                    getAssetToSD(url+"/"+fileContents[i],assetsName+"/"+fileContents[i]);                }else{                    //如果不是文件夹 那么则进行拷贝工作,就是一些流文件的操作。。。                    getFileCopy(mAm.open(assetsName+"/"+fileContents[i]),url+"/"+fileContents[i]);                }            }        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 创建文件夹     */    private void copyFolderToSD(String folderFileName,String sdUrl){        File file = new File(sdUrl,folderFileName);        if(!file.exists()){            file.mkdir();        }    }    /**     * 复制文件     * @param is  文件流     * @param mUrl 需要拷贝到SD卡的路径...     * @throws IOException     */    private void getFileCopy(InputStream is,String mUrl) {        File file = new File(mUrl);        InputStreamReader isr = null;        BufferedReader br = null;        isr = new InputStreamReader(is);        br = new BufferedReader(isr);        FileOutputStream fos = null;        OutputStreamWriter osw = null;        BufferedWriter bw = null;        try {            if(!file.exists()){                file.createNewFile();            }            fos = new FileOutputStream(file);            osw = new OutputStreamWriter(fos);            bw = new BufferedWriter(osw);            String ss;            String ioInfo = "";            while ((ss=br.readLine())!=null){                ioInfo+=ss;            }            bw.write(ioInfo);        } catch (IOException e) {            e.printStackTrace();        }finally {            try {                if(bw!=null){                    bw.close();                }                if(osw!=null){                    osw.close();                }                if(fos!=null){                    fos.close();                }                if(br!=null){                    br.close();                }                if(isr!=null){                    isr.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }    /**     * 删除工作     * @param url  需要删除内容的路径。。。     */    private void delFile(String url){        System.out.println("111");        File file = new File(url);        if(!file.exists()){            return;        }        String[] delFileList = file.list();        for (int i = 0; i <delFileList.length ; i++) {            String childFileUrl = url+"/"+delFileList[i];            File childFile = new File(childFileUrl);            if(childFile.isFile()){//判断是否是文件                childFile.delete();            }else{                //不是文件                delFile(childFileUrl);            }            //删除当前子文件夹            childFile.delete();        }    }}

附上源码。。。


1 0