由于assets和res下的文件都只可以读不可以写,那么在程序初始化后,将后期需要使用并且需要修改的文件复制到SD卡。下面代码提供一个工具类,将assets下的任意资源复制到SD卡下。

assets下的资源如下图:

下面是工具类: 
AssetsCopyTOSDcard .java

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; import android.content.Context;
import android.content.res.AssetManager;
import android.os.Environment; public class AssetsCopyTOSDcard {
Context context; public AssetsCopyTOSDcard(Context context) {
super();
this.context = context;
} /**
* @param context
* @param assetpath asset下的路径
* @param SDpath SDpath下保存路径
*/
public void AssetToSD(String assetpath,String SDpath ){ AssetManager asset=context.getAssets();
//循环的读取asset下的文件,并且写入到SD卡
String[] filenames=null;
FileOutputStream out = null;
InputStream in=null;
try {
filenames = asset.list(assetpath);
if(filenames.length>0){//说明是目录
//创建目录
getDirectory(assetpath); for(String fileName:filenames){
AssetToSD(assetpath+"/"+fileName, SDpath+"/"+fileName);
}
}else{//说明是文件,直接复制到SD卡
File SDFlie=new File(SDpath);
String path=assetpath.substring(0, assetpath.lastIndexOf("/"));
getDirectory(path); if(!SDFlie.exists()){
SDFlie.createNewFile();
}
//将内容写入到文件中
in=asset.open(assetpath);
out= new FileOutputStream(SDFlie);
byte[] buffer = new byte[1024];
int byteCount=0;
while((byteCount=in.read(buffer))!=-1){
out.write(buffer, 0, byteCount);
}
out.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
out.close();
in.close();
asset.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
//分级建立文件夹
public void getDirectory(String path){
//对SDpath进行处理,分层级建立文件夹
String[] s=path.split("/");
String str=Environment.getExternalStorageDirectory().toString();
for (int i = 0; i < s.length; i++) {
str=str+"/"+s[i];
File file=new File(str);
if(!file.exists()){
file.mkdir();
}
} }
}

MainActivity .java

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String path="aaa/a1.txt";
AssetsCopyTOSDcard assetsCopyTOSDcard=new AssetsCopyTOSDcard(getApplicationContext());
assetsCopyTOSDcard.AssetToSD(path,Environment.getExternalStorageDirectory().toString()+"/"+path);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
   测试路径:
aaa
Aaa/bbb
Aaa/bbb/ba.txt
Aaa/a1.txt

在编程过程中遇到的两个问题:

open failed: ENOENT (No such file or directory)
open failed: EISDIR (Is a directory)

错误修改

if(!SDFlie.exists()){
SDFlie.createNewFile();
}
//将内容写入到文件中
in=asset.open(assetpath);
out= new FileOutputStream(SDFlie);
byte[] buffer = new byte[1024];
int byteCount=0;
while((byteCount=in.read(buffer))!=-1){
out.write(buffer, 0, byteCount);
}
out.flush();

修改为:

if(!SDFlie.exists()){
SDFlie.createNewFile();
//将内容写入到文件中
in=asset.open(assetpath);
out= new FileOutputStream(SDFlie);
byte[] buffer = new byte[1024];
int byteCount=0;
while((byteCount=in.read(buffer))!=-1){
out.write(buffer, 0, byteCount);
}
} out.flush();

因为当文件存在时,不复制。不修改的情况下,out.close();会报空指针异常。

finally{
try {
out.close();
in.close();
asset.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

修改为:

finally{
try {
if(out!=null){
out.close();
out=null;
}
if(in!=null){
in.close();
in=null;
}
/**
* 关闭报错,java.lang.RuntimeException:
* Unable to start activity ComponentInfo
* {com.example.wealth/com.example.wealth.UI.main}:
* java.lang.RuntimeException: Assetmanager has been closed
*/
// if(asset!=null){
// asset.close();
// asset=null;
// }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

转: https://blog.csdn.net/qq_17326933/article/details/48450487

assets下的文件复制到SD卡的更多相关文章

  1. Android 访问assets下的文件

    assets下经常可以放一些比较大的资源,对于这些资源我们如何访问. 步骤 1.获取AssetManager. AssetManager am = getResources().getAssets() ...

  2. Android 下载文件及写入SD卡

    Android 下载文件及写入SD卡,实例代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  3. Android 将文件保存到SD卡中

    ①写文件到sd卡中需要获得权限,在AndroidManifest.xml中添加如下权限: <uses-permission android:name="android.permissi ...

  4. [置顶] Android学习系列-把文件保存到SD卡上面(6)

    Android学习系列-把文件保存到SD卡上面(5) 一般多媒体文件,大文件需要保存到SD卡中.关键点如下: 1,SD卡保存目录:mnt/sdcard,一般采用Environment.getExter ...

  5. Android项目使用Assets下的文件

    Android项目在编译时,Assets下文件不被编译. Assets下的文件除了 html文件可以直接在项目中使用外,其他的文件都需要做处理滴. 在项目中使用方法:        使用流读取.   ...

  6. android 将项目下的数据库拷贝到sd卡中

    /** * 将项目下的数据库拷贝到sd卡中 */ public static boolean copyDbToSdCard() { FileInputStream fis = null; FileOu ...

  7. asserts文件存到外部SD卡里

    package com.example.wang.testapp3; import android.content.res.AssetManager; import android.graphics. ...

  8. C# 把一个文件夹下所有文件复制到另一个文件夹下 把一个文件夹下所有文件删除(转)

    C# 把一个文件夹下所有文件复制到另一个文件夹下   public static void CopyDirectory(string srcPath, string destPath) { try { ...

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

    最近在做个功能是将asset文件夹下的所有文件(包括子文件)全部拷贝出来到指定目录下.所用的方法无非是用AssetManager.但是这里 有个问题是也要讲子文件夹和子文件都要拷贝出来.到网上Goog ...

随机推荐

  1. 暗之的锁链 [COGS2434] [树上差分]

    Description 无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径.另外,Dark ...

  2. Eclipse 安装Maven插件m2eclipse

    Eclipse->Help->Install New Software->Work with右边Add按钮->Name字段中输入m2e,Location字段中输入http:// ...

  3. .net 后台获取CheckBoxList的值

    版权声明:本文档可以随意转载,我愿意和大家共同分享,共同进步. http://blog.csdn.net/u014479921/article/details/73649799 1.前台的多选控件 & ...

  4. ES6_入门(1)_let命令

    1. let声明变量只在let命令所在的代码区内有效. "use strict"; /*如果不加"use strict";会报错:Uncaught Syntax ...

  5. plsql 工具怎样导出 oracle 表数据

    一.双击 plsql 工具,输入登陆用户.登陆密码以及登陆数据库名称,如下图: 二.菜单 Tools --> Export Tables...,如下图: 三.进入导出界面后,可以选择单个表,进行 ...

  6. C#实战技能之WebApi+Task+WebSocket

    一.背景介绍 环境的局限性: 用户在使用XX客户端的时候,必须每台电脑都安装打印组件,同时由于XX客户端使用的是 websocket进行通讯,这就必须限制用户的电脑浏览器必须是IE10.0+以上版本, ...

  7. Unity项目中文字的统一管理

    一款游戏在研发初期就需要考虑多语言的问题,否则后期在进行多国语言版本时就面临着巨大的成本.鉴于之前页游的经验,其它同事设计出读取Excel的方式来管理所有的文字.但是我在使用中发现很致使的一个问题,当 ...

  8. ABAP技术总结

      SAP ——ABAP/4 技术总结 V3.0 2014-10-14 --江正军 1. 1.1. 1.1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.7.1. 1.7.2. ...

  9. 减少apk包大小的一种思路

    现在apk大小主要是决定于两个:一个是图片一个是.SO文件(这个尽量用release包),而对于图片,既要越小,又要保持质量. 之前是PNG --> JPG, 现在直接是PNG ---> ...

  10. Docker 集群Swarm创建和Swarm Web管理

    关于Docker Swarm更多的介绍请查看<Docker管理工具-Swarm部署记录> 一.环境配置 1.安装环境 # cat /etc/redhat-release CentOS Li ...