Android res/raw文件 读取文件
2015-11-24 11:10
501 查看
注:原博:http://blog.csdn.net/zhangphil
Android res/raw文件以及raw与res/assets异同
通常,如果Android开发者有些文件比如音频,视频,.html,.mp3等等这些文件不希望编译器编译而保持原始原貌打包进apk文件(这在游戏开发中很常见和普遍,如游戏用到的游戏音乐、图等资源),那么可以使用Android在res目录下的res/raw和res/assets来保存。res/raw和res/assets目录下的文件将不被Android编译成二进制,Android将这些文件资源保持原状原封不动的打包进最终编译发布时候的apk文件。
res/raw和res/assets和既有相同点也有不同点。
(1)res/raw目录下的文件将被Android映射成R.id.xxx资源,访问该raw目录下的文件资源,可以通过R.id.filename获得映射,进而文件操作。但res/assets则不是这样,res/assets目录下的文件不会进行R.id. filename这样的映射,res/assets目录下的文件存放和访问模型与Java文件系统的读写模型类似。
(2)res/assets目录下的文件结构可以出现层级和树形结构;而res/raw则不能分层级。换句话说,可以在res/assets建立多层级、树形的文件目录结构,而res/raw下的文件资源必须平铺放在res/raw目录下。
(3)文件大小方面。在res/raw目录下的单个文件大小可以大到若干MB的尺寸,但res/assets文件目录下的单个文件大小尺寸尽量控制在MB量级以下,否则可能要出问题。
(4)res/assets目录下的文件资源访问一般是这样(如附录文章1所示):
AssetManager am=getAssets();
InputStream is=am.open("filename");
即通过AssetManager访问res/assets目录下资源。
res/raw目录下的文件资源访问一般是这样:
InputStream is =getResources().openRawResource(R.id.filename);
res/raw目录下的文件资源也可以通过这样先获得URI定位:
Uri uri= Uri.parse("android.resource://"+getPackageName()+"/"+ R.raw.filename);
(5)res/raw和res/assets目录下文件为只读。
给出一个读取raw数据的例子。
事先现在res目录下新建一个目录raw,然后在里面新建一个名为:zhangphil.txt的文件,该文件只有一行简单的字符串,注意编码格式是UTF-8,如图:
然后写Java代码:
代码运行结果输出:
Android res/raw文件以及raw与res/assets异同
通常,如果Android开发者有些文件比如音频,视频,.html,.mp3等等这些文件不希望编译器编译而保持原始原貌打包进apk文件(这在游戏开发中很常见和普遍,如游戏用到的游戏音乐、图等资源),那么可以使用Android在res目录下的res/raw和res/assets来保存。res/raw和res/assets目录下的文件将不被Android编译成二进制,Android将这些文件资源保持原状原封不动的打包进最终编译发布时候的apk文件。
res/raw和res/assets和既有相同点也有不同点。
(1)res/raw目录下的文件将被Android映射成R.id.xxx资源,访问该raw目录下的文件资源,可以通过R.id.filename获得映射,进而文件操作。但res/assets则不是这样,res/assets目录下的文件不会进行R.id. filename这样的映射,res/assets目录下的文件存放和访问模型与Java文件系统的读写模型类似。
(2)res/assets目录下的文件结构可以出现层级和树形结构;而res/raw则不能分层级。换句话说,可以在res/assets建立多层级、树形的文件目录结构,而res/raw下的文件资源必须平铺放在res/raw目录下。
(3)文件大小方面。在res/raw目录下的单个文件大小可以大到若干MB的尺寸,但res/assets文件目录下的单个文件大小尺寸尽量控制在MB量级以下,否则可能要出问题。
(4)res/assets目录下的文件资源访问一般是这样(如附录文章1所示):
AssetManager am=getAssets();
InputStream is=am.open("filename");
即通过AssetManager访问res/assets目录下资源。
res/raw目录下的文件资源访问一般是这样:
InputStream is =getResources().openRawResource(R.id.filename);
res/raw目录下的文件资源也可以通过这样先获得URI定位:
Uri uri= Uri.parse("android.resource://"+getPackageName()+"/"+ R.raw.filename);
(5)res/raw和res/assets目录下文件为只读。
给出一个读取raw数据的例子。
事先现在res目录下新建一个目录raw,然后在里面新建一个名为:zhangphil.txt的文件,该文件只有一行简单的字符串,注意编码格式是UTF-8,如图:
然后写Java代码:
package zhangphil.raw; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); readRaw(); } private void readRaw() { InputStream is = getResources().openRawResource(R.raw.zhangphil); try { byte[] buffer = readByteDataFromInputStream(is); String s = new String(buffer, 0, buffer.length, "UTF-8"); Log.d("读取到的raw数据", s); } catch (Exception e) { e.printStackTrace(); } } private byte[] readByteDataFromInputStream(InputStream is) throws IOException { BufferedInputStream bis = new BufferedInputStream(is); ByteArrayOutputStream baos = new ByteArrayOutputStream(); final int BUFFER_SIZE = 2 * 1024; final int EOF = -1; int c; byte[] buf = new byte[BUFFER_SIZE]; while (true) { c = bis.read(buf); if (c == EOF) break; baos.write(buf, 0, c); } is.close(); byte[] data = baos.toByteArray(); baos.flush(); return data; } }
代码运行结果输出:
相关文章推荐
- Android 触摸及手势操作GestureDetector
- 【Android】SDK和API Level版本的对应关系
- TUST项目知识点总结(Android端V1.0)
- android原生系统老系统不支持localstorage
- 50个Android开发技巧(01 好好利用layout_weight属性)
- Android VideoView简单播放视频
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- Android开发技巧——自定义控件之自定义属性
- Android开发技巧——自定义控件之自定义属性
- AndroidStudio配置SVN以及使用代码管理
- Android技术博客收藏(持续更新)
- Android开发进阶系列(八) 界面美化之自定义弹出框
- android使用获取所有应用的资源id和uri
- Android-在手机本地保存数据和读取数据
- Android Studio 使用Gradle在Terminal终端用命令打包
- Android的四种启动模式(launchModel)
- Android开源库
- Android性能优化之常见的内存泄漏
- notification的几种使用方法
- Android-Fragment动态例子