Android的assets文件夹资源访问

一、Android资源文件分类

Android资源文件大致可以分为两种:
 . 一种是res目录下存放的可编译的资源文件.
   这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可;

 . 一种是assets目录下存放的原生资源文件
   因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们。
   那我么能不能通过该资源的绝对路径去访问它们呢?
   因为apk安装之后会放在/data/app/**.apk目录下,以apk形式存在,asset/res和被绑定在apk里,
   并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,
   因为它们根本就没有。

还好Android系统为我们提供了一个AssetManager工具类。
查看官方API可知,AssetManager提供对应用程序的原始资源文件进行访问;
这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。

二、AssetManager类

1. 概述:
提供对应用程序的原始资源文件进行访问;
这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。
通过getAssets()方法获取AssetManager对象。

2. AssetManager类常用方法:
Public Methods :
. final String[] list(String path)
  返回指定路径下的所有文件及目录名。

. final InputStream open(String fileName)
   使用 ACCESS_STREAMING模式打开assets下的指定文件。.

. final InputStream open(String fileName, int accessMode)
  使用显示的访问模式打开assets下的指定文件.

三、操作步骤

assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager类以字节流的形式读取文件。
操作步骤:
step1. 先在Activity里面获取AssetManager引用。
         getAssets() 
     
step2. 再用AssetManager的open方法则指定读取的文件以及访问模式就能得到输入流InputStream。
         open(String fileName, int accessMode)
        
step3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得:
         inputStream.close() 

step4.关闭AssetManager。
         AssetManager.close() 

四、应用实例

1.加载assets目录下的网页:
    //加载assets/win8_Demo/目录下的index.html网页
    webView.loadUrl("file:///android_asset/win8_Demo/index.html");

说明:这种方式可以加载assets目录下的网页,并且与网页有关的css,js,图片等文件也会的加载。

2.访问assets目录下的资源文件:
    AssetManager.open(String filename),
    返回的是一个InputSteam类型的字节流,
    这里的filename必须是文件比如(aa.txt;img/semll.jpg),而不能是文件夹。

3.获取assets的文件及目录名:
    //获取assets目录下的所有文件及目录名,content(当前的上下文如Activity,Service等ContextWrapper的子类的都可以)
    String fileNames[] =context.getAssets().list(path);

4.将assets下的文件复制到SD卡:
/** 
 *  从assets目录中复制整个文件夹内容 
 *  @param  context  Context 使用CopyFiles类的Activity
 *  @param  oldPath  String  原文件路径  如:/aa 
 *  @param  newPath  String  复制后路径  如:xx:/bb/cc 
 */
public void copyFilesFassets(Context context,String oldPath,String newPath) {                    
    try {
        String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名
        if (fileNames.length > 0) {//如果是目录
            File file = new File(newPath);
            file.mkdirs();//如果文件夹不存在,则递归
            for (String fileName : fileNames) {
               copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);
            }
        } else {//如果是文件
            InputStream is = context.getAssets().open(oldPath);
            FileOutputStream fos = new FileOutputStream(new File(newPath));
            byte[] buffer = new byte[1024];
            int byteCount=0;               
            while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节        
                fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流
            }
            fos.flush();//刷新缓冲区
            is.close();
            fos.close();
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        //如果捕捉到错误则通知UI线程
                   MainActivity.handler.sendEmptyMessage(COPY_FALSE);
    }                           
}

5.使用assets目录下的图片资源:
    InputStream is=getAssets().open("wpics/0ZR424L-0.jpg");
    Bitmap bitmap=BitmapFactory.decodeStream(is);
    imgShow.setImageBitmap(bitmap);

需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作

6. 从resource的raw中读取文件数据:
String res = "";   
try{   
    //得到资源中的Raw数据流  
    InputStream in = getResources().openRawResource(R.raw.test);   
  
    //得到数据的大小  
    int length = in.available();         
  
    byte [] buffer = new byte[length];          
  
    //读取数据  
    in.read(buffer);           
  
    //依test.txt的编码类型选择合适的编码,如果不调整会乱码   
    res = EncodingUtils.getString(buffer, "BIG5");   
      
    //关闭      
    in.close();              
  
}catch(Exception e){   
    e.printStackTrace();           





7. 从resource的asset中读取文件数据
String fileName = "test.txt"; //文件名字   
String res="";   
try{   
   //得到资源中的asset数据流  
   InputStream in = getResources().getAssets().open(fileName);   
  
   int length = in.available();           
   byte [] buffer = new byte[length];          
  
   in.read(buffer);              
   in.close();  
   res = EncodingUtils.getString(buffer, "UTF-8");       
  
}catch(Exception e){   
    e.printStackTrace();           
}  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android应用程序中,assets文件夹中的文件是不会被解压到设备的文件系统中,也就是说它们没有绝对路径。因此,您不能直接获得assets文件夹中的PDF文件的路径。如果您需要使用PDF文件的路径,请考虑将其复制到设备的文件系统中,并使用文件路径来访问它。 以下是一个简单的示例代码,演示如何将assets文件夹中的PDF文件复制到设备的文件系统中: ```java try { InputStream inputStream = getAssets().open("example.pdf"); File outFile = new File(getExternalFilesDir(null), "example.pdf"); OutputStream outputStream = new FileOutputStream(outFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } outputStream.flush(); outputStream.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } ``` 在这个例子中,文件"example.pdf"被复制到设备的外部文件目录中。一旦复制完成,您就可以使用文件路径来访问它。例如,如果您将文件复制到设备的外部文件目录中,则可以使用以下代码来访问它: ```java File file = new File(getExternalFilesDir(null), "example.pdf"); String filePath = file.getAbsolutePath(); ``` 请注意,将assets文件夹中的文件复制到设备的文件系统中可能会占用设备的存储空间,并且可能会导致应用程序安装包的大小增加。如果您的PDF文件非常大,那么这种方法可能不适用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北雨南萍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值