AssetsUtils【读取assets、res/raw、./data/data/包名/目录下的文件】

版权声明:本文为博主原创文章,未经博主允许不得转载。

前言

封装了以下功能:

1、读取assets目录下的资源html、文件、图片,将文件复制到SD卡目录中;

2、读取res/raw目录下的文件内容;

3、读写./data/data/包名/下的文件;

效果图

代码分析

最常用的方法:getStringFromAssert(Context mContext, String assetsFilePath)【读取assets目录中的文件字符串】

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将AssetsUtils文件复制到项目中

package com.why.project.assetsutilsdemo.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.webkit.WebView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @Create By HaiyuKing
 * @Used AssetsUtils【读取assets、res/raw、./data/data/包名/目录下的文件】
 * <ui>
 * <li>1、读取assets目录下的资源html、文件、图片;将文件复制到SD卡目录中</li>
 * <li>2、读取res/raw目录下的文件内容</li>
 * <li>3、读写./data/data/包名/下的文件</li>
 * </ui>
 */
public class AssetsUtils {

    /**
     * 获取assets的指定目录中的所有文件及子目录名数组
     * @param assetsFolderPath - 目录的相对路径(目录),例如:"why"
     * @注意 子目录中必须有文件,否则不会将子目录名称写入数组中
     * @return [img,listdata.txt,test.html]
     * */
    public static String[] getFileNamesArray(Context mContext, String assetsFolderPath){
        String fileNames[] = null;
        try {
            fileNames = mContext.getResources().getAssets().list(assetsFolderPath);// 获取assets目录下的所有文件及子目录名
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return fileNames;
    }
    /**
     * 使用webview加载assets目录下的html网页。比如想要打开assets/why/test.html
     * @param assetsFilePath - html文件的相对路径,例如:"why/test.html"或者"test.html"
     * */
    public static void loadAssetsHtml(WebView id_webview, String assetsFilePath) {
        id_webview.loadUrl("file:///android_asset/" + assetsFilePath);
    }

    /**
     * 访问assets目录下的资源文件,获取文件中的字符串
     * @param assetsFilePath - 文件的相对路径,例如:"listitemdata.txt或者"/why/listdata.txt"
     * @return 内容字符串
     * */
    public static String getStringFromAssert(Context mContext, String assetsFilePath) {

        String content = ""; // 结果字符串
        try {
            InputStream is = mContext.getResources().getAssets().open(assetsFilePath);// 打开文件
            int ch = 0;
            ByteArrayOutputStream out = new ByteArrayOutputStream(); // 实现了一个输出流
            while ((ch = is.read()) != -1) {
                out.write(ch); // 将指定的字节写入此 byte 数组输出流
            }
            byte[] buff = out.toByteArray();// 以 byte 数组的形式返回此输出流的当前内容
            out.close(); // 关闭流
            is.close(); // 关闭流
            content = new String(buff, "UTF-8"); // 设置字符串编码
        } catch (Exception e) {
            Toast.makeText(mContext, "对不起,没有找到指定文件!", Toast.LENGTH_SHORT)
                    .show();
        }
        return content;
    }

    /**
     *  从assets目录中复制整个文件夹内容到SD卡中
     *  @param  mContext  Context 使用CopyFiles类的Activity
     *  @param  assetsFolderPath  String  assets的相对路径(目录)  如:"why"
     *  @param  sdFolderPath  String  复制到的sd路径(目录)  如:Environment.getExternalStorageDirectory() + "/why"
     */
    public static void copyFolderFromAssetsToSD(Context mContext, String assetsFolderPath, String sdFolderPath) {
        try {
            String fileNames[] = mContext.getResources().getAssets().list(assetsFolderPath);// 获取assets目录下的所有文件及目录名
            if (fileNames.length > 0) {//如果是目录,则新建目录
                File file = new File(sdFolderPath);
                if(! file.exists()){
                    file.mkdirs();//如果文件夹不存在,则创建目录
                }
                //递归,将目录下的单个文件复制到目录中
                for (String fileName : fileNames) {
                    copyFolderFromAssetsToSD(mContext, assetsFolderPath + "/" + fileName, sdFolderPath + "/" + fileName);
                }
            }else {//如果是文件

                InputStream is = mContext.getResources().getAssets().open(assetsFolderPath);
                FileOutputStream fos = new FileOutputStream(new File(sdFolderPath));
                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();
        }
    }

    /**
     *  从assets目录中复制单个文件到SD卡中
     *  @param  mContext  Context 使用CopyFiles类的Activity
     *  @param  assetsFilePath  String  assets的相对路径(目录)  如:"why/img/image.png"
     *  @param  sdFilePath  String  复制到的sd路径(目录)  如:Environment.getExternalStorageDirectory() + "/why/img.png"
     */
    public static boolean copyOneFileFromAssetsToSD(Context mContext, String assetsFilePath, String sdFilePath) {

        try {

            InputStream stream = mContext.getResources().getAssets().open(assetsFilePath);

            File file = new File(sdFilePath);

            OutputStream o = null;
            try {
                //创建父目录
                String parentPath = file.getAbsolutePath();
                String getFolderName = "";
                if(parentPath == null || parentPath.length() == 0){
                    getFolderName = parentPath;
                }else{
                    int filePosi = parentPath.lastIndexOf(File.separator);
                    getFolderName = (filePosi == -1) ? "" : parentPath.substring(0, filePosi);
                }

                Boolean makeDirs = false;
                if(getFolderName == null || getFolderName.length() == 0){
                    makeDirs = false;
                }else{
                    File folder = new File(getFolderName);
                    makeDirs = (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
                }
                if(makeDirs){
                    o = new FileOutputStream(file,false);
                    byte data[] = new byte[1024];
                    int length = -1;
                    while ((length = stream.read(data)) != -1) {
                        o.write(data, 0, length);
                    }
                    o.flush();
                    return true;
                }

            } catch (FileNotFoundException e) {
                throw new RuntimeException("FileNotFoundException occurred. ", e);
            } catch (IOException e) {
                throw new RuntimeException("IOException occurred. ", e);
            } finally {
                if (o != null) {
                    try {
                        o.close();
                        stream.close();
                    } catch (IOException e) {
                        throw new RuntimeException("IOException occurred. ", e);
                    }
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("Exception occurred. ", e);
        }
        return false;
    }

    /**
     * 获取assets目录下的图片资源的bitmap对象
     * @param assetsImgPath - 文件的相对路径,例如:image.png或者www/img/image.png
     * 使用方式:id_imageview.setImageBitmap(bitmap);
     * */
    public static Bitmap getImageBitmapFromAssetsFile(Context mContext, String assetsImgPath) {
        Bitmap bitmap = null;
        try {
            InputStream is = mContext.getResources().getAssets().open(assetsImgPath);
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    /**
     * 从res中的raw文件夹中获取文件并读取数据(资源文件只能读不能写)
     * @param rawFileId - 文件的ID值:R.raw.xxx;例如:R.raw.rawtext
     * @return 文件中的内容字符串
     */
    /*
     * 首先调用Context.getResource获得当前应用程序上下文的Resources引用.
     * 然后调用openRawResource(int id)得到InputStream.
     * 最后,操作InputStream得到数据。
     * 注意:把文件放在res/raw目录下,则R类会自动提供该id.*/
    public static String getStringFromRaw(Context mContext,int rawFileId) {
        String res = "";
        try {
            InputStream in = mContext.getResources().openRawResource(rawFileId);
            int length = in.available();
            byte[] buffer = new byte[length];
            in.read(buffer);
            //res = EncodingUtils.getString(buffer, "GBK");
            res = new String(buffer,"UTF-8");
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

    /**
     * 写入(./data/data/包名/file)文件里面内容
     *
     * @param file - 私有文件夹下的文件名,例如:datatext.txt【在/data/data/{package}/目录下】
     * @param message - 想要写入的数据字符串
     */
    public static void writeFileToData(Context mContext,String file, String message) {
        try {
            /*
             * MODE_APPEND 追加模式 - 如果已经存在的文件,将数据写入到现有文件的末尾而不是抹去它。
             * MODE_PRIVATE 私有模式 - 只有本程序或包名相同的程序才能访问
             * MODE_WORLD_READABLE 读取模式 - 其他程序可以读取此文件
             * MODE_WORLD_WRITEABLE - 写入模式 其他程序可以修改此文件
             * 除了追加模式其他模式都会将内容全部覆盖
             */
            FileOutputStream fout = mContext.openFileOutput(file, Context.MODE_PRIVATE);
            byte[] bytes = message.getBytes();
            fout.write(bytes);
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取./data/data/包名/file/下面的文件内容
     *
     * @param fileName - 私有文件夹下的文件名,例如:datatext.txt
     * @return
     */
    public static String getStringFileFromData(Context mContext,String fileName) {
        String res = "";
        try {
            FileInputStream fin = mContext.openFileInput(fileName);
            int length = fin.available();
            byte[] buffer = new byte[length];
            fin.read(buffer);
            //res = EncodingUtils.getString(buffer, "UTF-8");
            res = new String(buffer,"UTF-8");
            fin.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

}

AssetsUtils.java

在AndroidManifest.xml中添加权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.why.project.assetsutilsdemo">

    <!-- ======================AssetsUtils【读取assets、res/raw、./data/data/包名/目录下的文件】====================== -->
    <!-- 在SD卡中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 向SD卡写入数据权限 -->
    <uses-permission android:name="android.permission.REORDER_TASKS"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)

三、使用方法

获取assets的指定目录中的所有文件及子目录名数组

btn_getFileNamesArray.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取assets的指定目录中的所有文件及子目录名数组
                String[] assetsWwwFilesNameArray = AssetsUtils.getFileNamesArray(MainActivity.this,"why");
                String filesName = "--why\n";
                for(int i=0;i<assetsWwwFilesNameArray.length;i++){
                    filesName += "  --" + assetsWwwFilesNameArray[i] + "\n";
                }
                //显示
                hiddenAll();
                id_text.setVisibility(View.VISIBLE);
                id_text.setText(filesName);
            }
        });

使用webview加载assets目录下的html网页

loadAssetsHtml.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //使用webview加载assets目录下的html网页
                AssetsUtils.loadAssetsHtml(id_web,"why/test.html");
                //显示
                hiddenAll();
                id_web.setVisibility(View.VISIBLE);
            }
        });

访问assets目录下的资源文件,获取文件中的字符串

getStringFromAssert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //访问assets目录下的资源文件,获取文件中的字符串
                String listdata = AssetsUtils.getStringFromAssert(MainActivity.this,"listitemdata.txt");
                //显示
                hiddenAll();
                id_text.setVisibility(View.VISIBLE);
                id_text.setText(listdata);
            }
        });

从assets目录中复制整个文件夹内容到SD卡中

copyFolderFromAssetsToSD.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //从assets目录中复制整个文件夹内容到SD卡中
                String sdFolderPath = Environment.getExternalStorageDirectory() + "/why";
                AssetsUtils.copyFolderFromAssetsToSD(MainActivity.this, "why", sdFolderPath);
            }
        });

 

从assets目录中复制单个文件到SD卡中

copyOneFileFromAssetsToSD.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //从assets目录中复制单个文件到SD卡中
                String sdFilePath = Environment.getExternalStorageDirectory() + "/why/listitemdata.txt";
                AssetsUtils.copyOneFileFromAssetsToSD(MainActivity.this,"listitemdata.txt",sdFilePath);
            }
        });

获取assets目录下的图片资源的bitmap对象

getImageBitmapFromAssetsFile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取assets目录下的图片资源的bitmap对象
                Bitmap bitmap = AssetsUtils.getImageBitmapFromAssetsFile(MainActivity.this, "why/img/image.png");
                //显示
                hiddenAll();
                id_img.setVisibility(View.VISIBLE);
                id_img.setImageBitmap(bitmap);
            }
        });

从res中的raw文件夹中获取文件并读取数据(资源文件只能读不能写)

getStringFromRaw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //从res中的raw文件夹中获取文件并读取数据(资源文件只能读不能写)
                String rawFileStr = AssetsUtils.getStringFromRaw(MainActivity.this, R.raw.rawtext);
                //显示
                hiddenAll();
                id_text.setVisibility(View.VISIBLE);
                id_text.setText(rawFileStr);
            }
        });

写入(./data/data/包名/file)文件里面内容

writeFileToData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //写入(./data/data/包名/file)文件里面内容
                AssetsUtils.writeFileToData(MainActivity.this, "datatext.txt", "这是写入./data/data/包名/下的文件的内容");
            }
        });

读取./data/data/包名/file/下面的文件内容

getStringFileFromData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //读取./data/data/包名/file/下面的文件内容
                String dataFileStr = AssetsUtils.getStringFileFromData(MainActivity.this, "datatext.txt");
                //显示
                hiddenAll();
                id_text.setVisibility(View.VISIBLE);
                id_text.setText(dataFileStr);
            }
        });

混淆配置

参考资料

暂时空缺

项目demo下载地址

https://github.com/haiyuKing/AssetsUtilsDemo

时间: 2024-10-26 21:08:24

AssetsUtils【读取assets、res/raw、./data/data/包名/目录下的文件】的相关文章

assets res/raw 存放资源的限制 以及 读取方法

res/raw和assets的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 读取文件资源: 1.读取

Xamarin.Android 如何使用Assets目录下的文件

个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 Xamarin.Android  官网介绍地址:http://developer.xamarin.com/guides/android/application_fundamentals/resources_in_android/part_6_-_using_android_assets/ 这里插入一下Assets与Raw目录的异同点 这两个目录的相同点: 1. 这两个

socket实现两台FTP服务器指定目录下的文件转移(不依赖第三方jar包)

通过socket实现两台FTP服务器指定目录下的文件转移,其中包含了基础了ftp文件列表显示.上传和下载.这里仅供学习用,需掌握的点有socket.ftp命令.文件流读取转换等 完整代码如下: FtpFileTransfer.java package com.xxx.ftp.client; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io

Python 读取某个目录下的文件

读取某个目录下的文件,如'/Users/test/test_kmls'目录下有test1.txt.test2.txt. 第一种方法读出的all_files是test1.txt.test2.txt 1 import os 2 3 kml_path=os.path.abspath('/Users/test/test_kmls') 4 all_files=os.listdir(kml_path) 5 for file in all_files: 6 print file 第二种方法可以获得文件的全路径

php读取目录下的文件

工作需要写了一个读取指定目录下的文件,并显示列表,点击之后读取文件中的内容 高手拍砖,目录可以自由指定,我这里直接写的是获取当前文件目录下面的所有文件 </pre> <?php /** * 读取指定目录下面的文件内容 * @author Administrator * */ class Catlog { /** * 要读取的目录 * @var string */ private $dir; /** * 文件名中必须存在 * @var string */ private $str = 'p

iOS案例:读取指定目录下的文件列表

// // main.m // 读取指定目录下的文件列表 // // Created by Apple on 15/11/24. // Copyright © 2015年 Apple. All rights reserved. // /* *读取指定目录下的文件列表 */ #import <Foundation/Foundation.h> void myQuickMethod(); int main(int argc, const char * argv[]) { //文件操作对象 NSFil

安卓安装完应用后,如何获取包的meta-inf目录下的文件?

============问题描述============ 安卓安装完应用后,可以获取包的meta-inf目录下的文件吗? 在手机上安装完了应用后,然后打开应用,此时,应用里的SDK有没有办法取到应用包里的meta-inf文件? 为什么要这么做? 因为同一个应用包,需要往里面打不同的渠道ID. 然后又要保持签名一致. 这个时候需要往meta-inf里面写文件,因为这样不会影响到签名. 但是问题来了,如果一两个渠道还好,可以手工把渠道ID打到SDK里就可以,但是一旦渠道太多,应用太多的话,不可能手工

Myeclipse中文件已经上传到服务器目录下,文件也没有被占用,但是页面中无法读取和使用问题的解决方法

这个问题是由于Myeclipse中文件不同步引起的.在Myeclipse中,工程文件是由Myeclipse自动扫描添加的,如果在外部修改了工程目录中的文件但又关闭了自动刷新功能,则会引起文件不同步.此外,在外部没有修改Myeclipse工程中的文件也有可能引起该问题. 解决方法: 有两种解决方法: 1)手动刷新.即在Myeclipse的工程目录中,右键refresh(或者按下F5). 2)配置Myeclipse的选项: a)Myeclipse启动时,刷新workspace,即勾选:window-

java读取某个目录下所有文件并通过el表达式将相关文件信息展示出来,js提供页面搜索及查看下载功能

从服务器上读取某个目录下的文件  将文件名 文件修改日期   及文件 大小展示在前台  并可以查看及下载 第一步:读取文件目录下的文件,并将文件按时间由大到小排列 public ArrayList<File> getLogs() { // TODO Auto-generated method stub ArrayList<File>  tomcatLogs = new ArrayList<File>(); File path = new File(""