当前位置:   article > 正文

我的Android之旅(十七)---raw和assets目录--数据的存取_raw-assets

raw-assets


raw是Resources (res)的子目录,Android会自动的为这目录中的所有资源文件生成一个ID,这个ID会被存储在R类当中,作为一个文件的引用。这意味着这个资源 文件可以很容易的被Android的类和方法访问到,甚至在Android XML文件中你也可以@raw/的形式引用到它。

assets目录更像一个附录类型的目录,Android不会为这个目录中的文件生成ID并保存在R类当中,因此它与 Android中的一些类和方法兼容度更低。

raw和assets的相同点:
 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

raw和assets的不同点:
  1.raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
  2.raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

二者读取文件内容的方式也不同:


  1.读取raw下的文件资源,通过以下方式获取输入流来进行写操作
  InputStream is = getResources().openRawResource(R.id.filename);
  2.(1)读取assets下的文件资源,通过以下方式获取输入流来进行写操作
  AssetManager am = null;
  am = getAssets();
  InputStream is = am.open("filename");

下面的例子就体现了二者在读取文件资源时的不同之处;

首先要建立raw文件以及assets目录,并分别在二者中新建File文件:


           

并在两个文件中任意输入一些数据,作为读取的资源。

.xml文件中的代码:

  1. package com.jerehedu.jereduch10;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.TextView;
  7. import java.io.BufferedReader;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.InputStreamReader;
  11. public class ReadRawAndAssetsActivity extends AppCompatActivity {
  12. private Button raw,assets;
  13. private TextView show;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_read_raw_and_assets);
  18. raw= (Button) findViewById(R.id.raw);
  19. assets= (Button) findViewById(R.id.assets);
  20. show= (TextView) findViewById(R.id.show);
  21. raw.setOnClickListener(new View.OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. show.setText(readRaw());
  25. }
  26. });
  27. assets.setOnClickListener(new View.OnClickListener() {
  28. @Override
  29. public void onClick(View v) {
  30. show.setText(readAssets());
  31. }
  32. });
  33. }
  34. //读取Assets目录
  35. public String readAssets(){
  36. StringBuilder sbd=new StringBuilder();
  37. InputStream is=null;
  38. BufferedReader reader=null;
  39. try {
  40. is= getResources().getAssets().open("setting");
  41. reader=new BufferedReader(new InputStreamReader(is));
  42. String row="";
  43. while ((row=reader.readLine())!=null){
  44. sbd.append(row);
  45. sbd.append("\n");
  46. }
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }finally {
  50. if (reader!=null){
  51. try {
  52. reader.close();
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. return sbd.toString();
  59. }
  60. //读取raw文件夹
  61. public String readRaw(){
  62. StringBuilder sbd=new StringBuilder();
  63. InputStream is=null;
  64. BufferedReader reader = null;
  65. is=getResources().openRawResource(R.raw.setting1);
  66. reader=new BufferedReader(new InputStreamReader(is));
  67. String row = "";
  68. try {
  69. while ((row=reader.readLine())!=null){
  70. sbd.append(row);
  71. sbd.append("\n");
  72. }
  73. } catch (IOException e) {
  74. e.printStackTrace();
  75. }finally {
  76. if (reader!=null){
  77. try {
  78. reader.close();
  79. } catch (IOException e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. }
  84. return sbd.toString();
  85. }
  86. }

二者的区别在于:

获取数据的方法不同,其余差不多

读取Assets目录
is=  getResources().getAssets().open("setting");
读取raw文件夹
is=getResources().openRawResource(R.raw.setting1);

布局中的代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. tools:context="com.jerehedu.jereduch10.ReadRawAndAssetsActivity">
  11. <Button
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:id="@+id/raw"
  15. android:text="读取raw"
  16. />
  17. <Button
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:id="@+id/assets"
  21. android:text="读取assets"
  22. android:layout_marginEnd="49dp"
  23. android:layout_alignParentTop="true"
  24. android:layout_alignEnd="@+id/show" />
  25. <TextView
  26. android:layout_width="match_parent"
  27. android:layout_height="300dp"
  28. android:id="@+id/show"
  29. android:layout_centerVertical="true"
  30. android:layout_alignParentStart="true" />
  31. </RelativeLayout>


运行结果如下:

点击raw按钮:

点击ASSETS按钮:

在学的过程中一定要理解二者的区别。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/854582
推荐阅读
相关标签
  

闽ICP备14008679号