版权声明:本文为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\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

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

  1. 转载 Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))

    转载:程兴亮文章,地址;http://www.cnblogs.com/chengxingliang/archive/2011/02/07/1949579.html 使用WebClient读取XAP包同 ...

  2. Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】

    使用WebClient读取XAP包同目录下的XML文件 我们想要读取XAP包下面的XML文件,需要将此XML文件放在加载XAP包的网页的目录中去,然后使用URI方式读取此URL方式下的XML文件. 首 ...

  3. 如何在安卓/data(而不是/data/data)目录下进行文件的读写操作

    分析:Android默认是无法直接操作/data目录的,只能读写程序自己的私有目录,也就是/data/data/package name/下,默认只能操作这个目录下的文件,也就是我们想直接读写/dat ...

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

    原文:Xamarin.Android 如何使用Assets目录下的文件 个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 ...

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

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

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

    // // main.m // 读取指定目录下的文件列表 // // Created by Apple on 15/11/24. // Copyright © 2015年 Apple. All rig ...

  7. php读取目录下的文件

    工作需要写了一个读取指定目录下的文件,并显示列表,点击之后读取文件中的内容 高手拍砖,目录可以自由指定,我这里直接写的是获取当前文件目录下面的所有文件 <?php /** * 读取指定目录下面的 ...

  8. Python 读取某个目录下的文件

    读取某个目录下的文件,如'/Users/test/test_kmls'目录下有test1.txt.test2.txt. 第一种方法读出的all_files是test1.txt.test2.txt im ...

  9. [Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

随机推荐

  1. GitHub 系列之「团队合作利器 Branch」

    Git 相比于 SVN 最强大的一个地方就在于「分支」,Git 的分支操作简直不要太方便,而实际项目开发中团队合作最依赖的莫过于分支了,关于分支前面的系列也提到过,但是本篇会详细讲述什么是分支.分支的 ...

  2. Python操作Redis之设置key的过期时间

    对于一个已经存在的key,我们可以设置其过期时间,到了那个时间后,当你再去访问时,key就不存在了 有两种方式可以设置过期时间,一种是指定key从当前时间开始算起还能存活多久,时间单位有两个,一个是秒 ...

  3. java 中 “==” 和 equals 的区别

    转自https://www.cnblogs.com/www123----/p/7857298.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new Strin ...

  4. 浅谈Java中的final关键字

    浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  5. 【最小生成树】Bzoj1601[Usaco2008 Oct]灌水

    Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. ...

  6. bzoj 2038 小z的袜子 莫队

    莫队大法好,入坑保平安 只要能O(1)或O(log)转移,离线莫队貌似真的无敌. #include<cstdio> #include<iostream> #include< ...

  7. MySQL-5.6.36-部署安装(编译版)

    1.系统环境(本站使用centos6.8_x64) [root@centos ~]# cat /etc/redhat-release CentOS release 6.8 (Final) 2.yum安 ...

  8. Sublime text3所遇到的问题

    sublime text3的下载地址:https://www.sublimetext.com/ 解决sublime text上不能使用交互的input的输入问题 通过安装sublimeREPL插件解决 ...

  9. HTTP 视频怎么在 MIP 页面中使用?

    在 MIP 中,一些资源的使用需要支持 HTTPS,视频就是其中一种.但目前大部分站点的视频资源都还是 HTTP 的资源,无法在百度 MIP 搜索结果中直接使用, mip-video 视频组件针对 H ...

  10. 从壹开始微服务 [ DDD ] 之终篇 ║当事件溯源 遇上 粉丝活动

    回首 哈喽~大家好,时间过的真快,关于DDD领域驱动设计的讲解基本就差不多了,本来想着周四再开一篇,感觉没有太多的内容了,剩下的一个就是验证的问题,就和之前的JWT很类似,就不打开一个章节了,而且这个 ...