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,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。
Android除了提供/res目录存放资源文件外,在/assets目录也会提供存放资源文件,在/assets目录下面不会在R.java里面自动生成ID,所以读取assets目录下面的资源文件需要提供路径,我们可以通过AssetManager类来访问这些文件。
assets文件夹资源的访问
assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。
1. 先在Activity里面调用getAssets() 来获取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。
3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close() 。
4.调用AssetManager.close() 关闭AssetManager。
需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作
以下为从Raw文件中读取:
代码
public String getFromRaw(){
try {
InputStreamReader inputReader = new InputStreamReader( getResources().openRawResource(R.raw.test1));
BufferedReader bufReader = new BufferedReader(inputReader);
String line="";
String Result="";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}
}
以下为直接从assets读取
代码
public String getFromAssets(String fileName){
try {
InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) );
BufferedReader bufReader = new BufferedReader(inputReader);
String line="";
String Result="";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}
}
接下来举个例子
我们新建一个工程文件,命名为AssetsDemo。
然后建立一个布局文件,如下,很简单,无需我多介绍,大家一看就明白。
然后呢,我从网上找了段文字,存放在assets文件目录下,取名为health.txt 这就是今天我们要读取的文件啦。
health.txt可以自己写点内容放进assets文件夹下就可以了。
接下来,就是今天的重头戏,Android读取文件的核心代码。就直接贴代码了。
package com.assets.cn;
import java.io.InputStream;
import org.apache.http.util.EncodingUtils;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;
public class AssetsDemoActivity extends Activity {
public static final String ENCODING = "UTF-8";
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv1 = (TextView)findViewById(R.id.tv1);
tv1.setTextColor(Color.BLACK);
tv1.setTextSize(25.0f);
tv1.setText(getFromAssets("health.txt"));
}
//从assets 文件夹中获取文件并读取数据
public String getFromAssets(String fileName){
String result = "";
try {
InputStream in = getResources().getAssets().open(fileName);
//获取文件的字节数
int lenght = in.available();
//创建byte数组
byte[] buffer = new byte[lenght];
//将文件中的数据读到byte数组中
in.read(buffer);
result = EncodingUtils.getString(buffer, ENCODING);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
一、assets和raw目录
1. assets。assets类资源放在工程根目录的assets子目录下,它里面保存的是一些原始的文件,可以以任何方式来进行组织。这些文件最终会被原装不动地打包在apk文件中。如果我们要在程序中访问这些文件,那么就需要指定文件名来访问。例如,假设在assets目录下有一个名称为filename的文件,那么就可以使用以下代码来访问它:
2、raw。raw是res下的子目录, --raw。这类资源以任意格式的文件保存在res/raw目录下,它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID,这样我们就可以在程序中通过ID来访问它们。例如,假设在res/raw目录下有一个名称为filename的文件,并且它在编译的过程,被赋予的资源ID为R.raw.filename,那么就可以使用以下代码来访问它:
更详细信息可参考大牛神作 http://blog.csdn.net/luoshengyang/article/details/8738877
二、其中properties资源文件的读取
1. 如果放入了assets文件夹中,可以如下打开:
Properties pro = new Properties();
InputStream is = context.getAssets().open("test.properties");
pro.load(is);
2. 如果放入到raw文件夹中,可以通过如下方式打开:
InputStream is = context.getResources().openRawResource(R.raw.test);
3. 如果没有上下文住处,则可用java传统的方式来打开:
Properties pro = new Properties();
pro.load(FileLoad.class.getResourceAsStream("/assets/test.properties")); //或者/res/raw/test.properties
二、从下图看出四种资源文件的格式与在配置文件中的使用
1.图片资源文件前缀名不能使用大写字母并且不能以数字开头
2.颜色资源文件、尺寸资源文件和字符资源文件所在的目录都必须是values,并且文件名是固定的,
如下图中示例
3.颜色资源文件、尺寸资源文件和字符资源文件的内容格式如下图示例
4.四种资源文件在布局资源文件中的使用如下图示例, 已经可以使用在AndroidManifest.xml文件中
二、Java代码操作资源文件
1.操作资源文件的对象的获取
Resources res = context.getResources(); (getResources()实现方法是类Context中声明的方法)
2.strings.xml资源文件被java代码操作
/** 第一种
String school =res.getString(R.string.school);// 成都中心大学
textView.setText(school);
**/
/** 第二种
String school = context.getString(R.string.school);
textView.setText(school);
**/
/**第三种
textView.setText(R.string.school);
*/
3.colors.xml 资源文件被java代码操作
int myRed =res.getColor(R.color.my_red);
context.textView.setTextColor(myRed);
4. dimens.xml资源文件被java代码操作
float bigSize = res.getDimension(R.dimen.bigSize);
textView.setTextSize(bigSize);
5.图片资源文件被java代码操作
(1)设置LinearLayout的背景
/**第一种
Drawable bc =res.getDrawable(R.drawable.bc);
linearLayout .setBackgroundDrawable(bc);//设置背景图片
*/
/**第二种
linearLayout .setBackgroundResource(R.drawable.bc);
*/
(2)设置ImageView的src
/**第一种
Drawable bc = res.getDrawable(R.drawable.xx);
imageView.setImageDrawable(bc);
*/
/**第二种
Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.xx);
imageView.setImageBitmap(bitmap);
*/
/**第三种
imageView.setImageResource(R.drawable.xx);
*/