Android数据的简单存储-File

又是一个学习的美好一天。前几天学习了一下安卓里的存储机制,那么这也就急着来拿出小本本总结一波啦~


那么总结之前我们先来看一下存储的不同使用方法图(图片如下)

今天我们就主要讲解一下File和ShredPreferences这两种存储方式

  • Fdile的使用

    那么我们先来布置一下布局吧(当然得先装潢一波)

    小提示:这里我用的是约束布局
    <EditText
          android:id="@+id/editText"
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_gravity="center_horizontal"
          android:layout_marginTop="177dp"
          android:layout_marginEnd="41dp"
          android:hint="请输入数据"
          android:inputType="textPersonName"
          app:layout_constraintEnd_toStartOf="@+id/btn1"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
    
      <Button
          android:id="@+id/btn1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginEnd="32dp"
          android:text="保存"
          app:layout_constraintBaseline_toBaselineOf="@+id/editText"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toEndOf="@+id/editText" />
    
      <Button
          android:id="@+id/btn2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginBottom="310dp"
          android:text="转换到活动2"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent" />
    

    布局外置好了,那我们来装扮装扮内饰(MainActivity.java)

    public class MainActivity extends AppCompatActivity {
      private EditText edit;//输入框
      private Button btn1;//保存的按钮
      private Button btn2;//跳转的按钮
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          edit = findViewById(R.id.editText);
          btn1 = findViewById(R.id.btn1);
          btn2 = findViewById(R.id.btn2);
          btn1.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  //获取edit数据(这里的trim()起到了去空格的作用)
                  String data = edit.getText().toString().trim();
                  //本地保存数据
                  save(data);//调用save()方法
                  Toast.makeText(getApplicationContext(), load(), Toast.LENGTH_SHORT).show();//显示一下康康保存木有~
              }
          });
          btn2.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  //这里就是比较简单的intent跳转
                  Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                  startActivity(intent);
              }
          });
      }
    
      public void save(String str) {
          FileOutputStream out = null;
          BufferedWriter writer = null;
          try {
              out = openFileOutput("key", MainActivity.MODE_PRIVATE);
              writer = new BufferedWriter(new OutputStreamWriter(out));
              writer.write(str);
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              if (writer != null) {
                  try {
                      writer.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
      /**可以看到主要用到了Stream类,StreamWrite类和当前上下文的OpenFileOutput方法。
      OpenFileOutput方法中第一个参数”key”是文件名,第二个参数FileCreationMode.Private说明当文件同名时,会覆盖原文件中的内容,如果是FileCreationMode.Append则会追加内容。
      */
    

    保存的代码完成后,为了代码逻辑更加的清晰,这里我们再另建一个活动

    先看看布局内容吧

    <TextView
          android:id="@+id/editText"
          android:layout_width="250dp"
          android:layout_height="wrap_content"
          android:layout_gravity="center_horizontal"
          android:gravity="center_horizontal"
          android:layout_marginTop="223dp"
          android:textSize="30sp"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
    
      <Button
          android:id="@+id/btn1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginTop="119dp"
          android:text="接收"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/editText" />
    

    然后便是接收的java代码了

    public class Main2Activity extends AppCompatActivity {
      private TextView edit ;
      private Button btn ;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main2);
          edit = findViewById(R.id.editText);
          btn = findViewById(R.id.btn1);
          btn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  String str = load();//返回值赋给str
                  edit.setText(str);//显示文本
              }
          });
      }
      public String load(){
          FileInputStream in = null ;
          BufferedReader reader = null ;
          StringBuilder builder = new StringBuilder();
          try {
              in = openFileInput("key");
              reader = new BufferedReader(new InputStreamReader(in));
              String line = " ";
              while ((line = reader.readLine()) != null){
                  builder.append(line);
              }
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              if (reader != null){
                  try {
                      reader.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
          return builder.toString();
      }
    }
    /**
    可以看到先通过OpenFileInput方法打开文件并返回一个Stream对象,
    再把这个对象做为StreamReader的构造方法参数来得到StreamReader对象,最后用ReadLine()方法来一行一行读取文件中的数据。
    */
    

    下面再来一波真机演示(动图如下)

  • SharedPreferences的使用

    那么我们先来布置一下布局吧(当然得先装潢一波)

    小提示:这里我用的是约束布局
    <Button
          android:id="@+id/btn1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginTop="220dp"
          android:text="保存"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintHorizontal_bias="0.498"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
    
      <Button
          android:id="@+id/btn2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginStart="3dp"
          android:layout_marginTop="95dp"
          android:text="读取"
          app:layout_constraintStart_toStartOf="@+id/btn1"
          app:layout_constraintTop_toBottomOf="@+id/btn1" />
    
      <TextView
          android:id="@+id/textView"
          android:layout_width="171dp"
          android:layout_height="56dp"
          android:text="TextView"
          android:gravity="center_horizontal"
          app:layout_constraintBottom_toTopOf="@+id/btn2"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/btn1" />
    
      <EditText
          android:id="@+id/ed1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginTop="64dp"
          android:ems="10"
          android:inputType="textPersonName"
          android:hint="姓名"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
    
      <EditText
      android:id="@+id/ed2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="12dp"
      android:ems="10"
      android:hint="性别"
      android:inputType="textPersonName"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/ed1" />
    
      <EditText
          android:id="@+id/ed3"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginTop="12dp"
          android:ems="10"
          android:hint="班级"
          android:inputType="textPersonName"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/ed2" />
    

    布局外置好了,那我们来装扮装扮内饰(MainActivity.java)

    public class MainActivity extends AppCompatActivity {
      private EditText ed1;//名字
      private EditText ed2;//年龄
      private EditText ed3;//班级
      private TextView tv1;//显示文本
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          ed1 = findViewById(R.id.ed1);
          ed2 = findViewById(R.id.ed2);
          ed3 = findViewById(R.id.ed3);
          tv1 = findViewById(R.id.textView);
          //保存按钮点击监听事件
          findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  String name = ed1.getText().toString().trim();//去空格
                  String age = ed2.getText().toString().trim();
                  String classroom = ed3.getText().toString().trim();
                  //调用getSharedPreferences方法创建(已存在则打开)名为key的文件并返一个ISharedPreferences接口
                  //再通过这个接口的Edit方法得到ISharedPreferencesEditor接口
                  SharedPreferences.Editor editor = getSharedPreferences("key", MODE_PRIVATE).edit();//
                  //再通过PutInt等方法添加要保存的数据,
                  editor.putString("name", name);
                  editor.putString("age", age);
                  editor.putString("classroom", classroom);
                  //最后调用Apply方法或者commit方法提交数据。
                  editor.commit();
              }
          });
          findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  //提取preference的信息
                  SharedPreferences pref = getSharedPreferences("key", MODE_PRIVATE);
                  String name = pref.getString("name", "");
                  String age = pref.getString("age", "");
                  String classroom = pref.getString("classroom", "");
                  //这里使用安卓的TextUtils的isEmpty方法来检测输入是否为空
                  if (android.text.TextUtils.isEmpty(name)
                          || android.text.TextUtils.isEmpty(age)
                          || android.text.TextUtils.isEmpty(classroom)) {
                      tv1.setText("输入数据为空\n请完成所有选项");
                  } else {
                      tv1.setText("姓名:" + name + "\n" + "年龄:" + age + "\n" + "班级:" + classroom + "\n");
                  }
    
        }
    });
}

}

```

下面再来一波真机演示(动图如下)

那么SharedPreferences和File的存储方式也就都介绍一遍了~

文章作者: 大熊先生
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 大雄先生
Android
喜欢就支持一下吧