首页 > 代码库 > AssetsUtils【读取assets、res/raw、./data/data/包名/目录下的文件】

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 = http://www.mamicode.com/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

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