zoukankan      html  css  js  c++  java
  • AssetsUtils【读取assets、res/raw、./data/data/包名/目录下的文件】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处!

    前言

    封装了以下功能:

    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
    ";
                    for(int i=0;i<assetsWwwFilesNameArray.length;i++){
                        filesName += "  --" + assetsWwwFilesNameArray[i] + "
    ";
                    }
                    //显示
                    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

  • 相关阅读:
    分库分表就能无限扩容吗?
    每天数十亿次请求的应用经验分享,值得参考!
    QPS、TPS、并发用户数、吞吐量
    Django优雅集成MongoDB
    Linux apt-get
    Python Tenacity 实现"重试机制"
    Kubernetes 系列(一):Kubernetes 介绍、架构、安装
    MongoDB学习笔记:文档Crud Shell
    ubuntu下快速安装rabbitmq
    Reactor模型详解:单Reactor多线程与主从Reactor多线程
  • 原文地址:https://www.cnblogs.com/whycxb/p/7181777.html
Copyright © 2011-2022 走看看