经常会使用到这两个路径下的文件,特别是希望使用这里的数据进行模仿访问互联网读取数据;
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类;
2.res/raw不可以有目录结构,而assets则可以有目录结构,assets支持任意深度的子目录,也就是assets目录下可以再建立文件夹;
res/raw:存放通用的文件, 该文件夹内的文件将不会被编译成二进制文件,按原样复制到设备上;
res:用于存放应用程序的资源(如图标、GUI布局等),将被打包到编译后的Java中。不支持深度子目录;
res/xml:
存放通用的XML文件
读取方式不同:
读取res/raw下的文件资源
InputStream is = getResources().openRawResource(R.id.filename);
读取assets下的文件资源
AssetManager am = getAssets();
InputStream is = am.open("filename.txt");
这里读取数据的方便之处在于不用涉及到sd卡,并且不用任何文件读写权限
public class MainActivity extends Activity {
private String tag = "MainActivity";
private TextView textView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1 = (TextView) findViewById(R.id.textView1);
findViewById(R.id.button).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// readAssetsFile();
readRawFile();
}
});
}
// / 读取assets目录下的文件
private void readAssetsFile() {
AssetManager assetManager = null;
assetManager = this.getAssets();
try {
InputStream inputStream = assetManager.open("msg.txt");
ByteArrayOutputStream outputStream = null;
outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
length = inputStream.read(buffer);
while (length != -1) {
outputStream.write(buffer, 0, length);
length = inputStream.read(buffer);
}
byte[] data = outputStream.toByteArray();
String result = new String(data, "utf-8");
Log.i(tag, result);
textView1.setText(result);
} catch (IOException e) {
e.printStackTrace();
}
}
// / 读取res/raw目录下的文件
private void readRawFile() {
try {
InputStream inputStream = getResources().openRawResource(
R.raw.msgraw);
ByteArrayOutputStream outputStream = null;
outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
length = inputStream.read(buffer);
while (length != -1) {
outputStream.write(buffer, 0, length);
length = inputStream.read(buffer);
}
byte[] data = outputStream.toByteArray();
String result = new String(data, "UTF-8");
Log.i(tag, result);
textView1.setText(result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
因为编码问题,可以这样读取utf-8的文件:
private String readDataAssets() {
try {
InputStream is = getAssets().open("msg.txt");
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int i = is.read();
while (i != -1) {
bo.write(i);
i = is.read();
}
// 因为文件编码与工程均为UTF-8所以可以这样返回,如果不一致,会出现乱码
return bo.toString();
} catch (IOException e) {
return e.toString();
}
}
较之两者的区别,一个支持R文件直接读取方便,一个支持任意深度子目录,视实际情况而定;