◆Android文件系统

image.png

image.png

◆数据存储的方式概述

在Android SDK中关于数据存储一共有以下几种:
◆内部存储
◆存储在手机内存中,适合保存一些是不太大的临时数据
◆外部存储(存储在SD卡中)
◆基本上什么数据都可以保存
◆Sqlite数据库
◆适合保存有一定规则的数据
◆Shared Preferences
◆存储在APP安装目录下,会生成一个xml文件,只能本程序访问
◆适合存储简单零散的数据
◆网络存储
◆从服务器获取数据
◆Content Provider(内容提供者)应用与应用数据共享的通道

◆数据存储方式1:内部存储(存储在手机内存中)

image.png

实例:用户登录程序

image.png

关键代码

image.png
image.png

写入用户名并读取用户名

image.png

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:orientation="vertical"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <EditText
  9. android:id="@+id/edt_user"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:hint="请在此输入用户名"/>I
  13. <EditText
  14. android:id="@+id/edt_pass"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:hint="请在此输入密码"/>I
  18. <CheckBox
  19. android:id="@+id/checkbox"
  20. android:text="记住用户名"
  21. android:layout_width="match_parent"
  22. android:layout_height="wrap_content"/>
  23. <Button
  24. android:id="@+id/btn1"
  25. android:onClick="btnClick"
  26. android:text="登录"
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"/>
  29. </LinearLayout>

MainActivity.java

  1. package com.bluelesson.a303;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.CheckBox;
  6. import android.widget.CompoundButton;
  7. import android.widget.EditText;
  8. import android.widget.Toast;
  9. import java.io.File;
  10. import java.io.FileInputStream;
  11. import java.io.FileNotFoundException;
  12. import java.io.FileOutputStream;
  13. import java.io.IOException;
  14. import java.io.InputStream;
  15. public class MainActivity extends AppCompatActivity {
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. initCtrl();
  21. initCheckBox();
  22. }
  23. //这个函数在打开app时,会自动读取config.txt中的用户名
  24. private void initCtrl() {
  25. //获取用户名界面
  26. EditText editText =findViewById(R.id.edt_user);
  27. String user = editText.getText().toString();
  28. //读取配置文件中用户名,设置对象
  29. //String path="/data/data/com.bluelesson.a303/config.txt";
  30. String packgeName = getPackageName();
  31. //String path = "/data/data"+File.separator+packgeName+File.separator+"config.txt";
  32. String filesDir = getFilesDir().getPath();
  33. String path = filesDir+File.separator+"config.txt";
  34. File file=new File(path);
  35. int fileLen = (int)file.length();
  36. try {
  37. FileInputStream inputStream=new FileInputStream(file);
  38. byte bytes[] = new byte[fileLen];
  39. inputStream.read(bytes);
  40. inputStream.close();
  41. String s = new String(bytes);
  42. editText.setText(s);
  43. } catch (FileNotFoundException e) {
  44. e.printStackTrace();
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. //这个函数在密码不对时,也会保存用户名
  50. private void initCheckBox() {
  51. //1.获取界面对象
  52. CheckBox checkBox=findViewById(R.id.checkbox);
  53. //2.设置监听器
  54. checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  55. @Override
  56. public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
  57. //获取用户名
  58. EditText editText =findViewById(R.id.edt_user);
  59. String user = editText.getText().toString();
  60. //保存用户名
  61. //String path="/data/data/com.bluelesson.a303/config.txt";
  62. String fileDir = getFilesDir().getPath();
  63. String path = fileDir+File.separator+"config.txt";
  64. File file=new File(path);
  65. try {
  66. FileOutputStream outputStream=new FileOutputStream(file);
  67. byte bytes[] = user.getBytes();
  68. outputStream.write(bytes);
  69. outputStream.close();
  70. } catch (FileNotFoundException e) {
  71. e.printStackTrace();
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. });
  77. }
  78. //这个函数在密码正确时,并在选中了保存时,才会保存用户名
  79. public void btnClick(View view) {
  80. //获取用户名
  81. EditText editText =findViewById(R.id.edt_user);
  82. String user = editText.getText().toString();
  83. //获取用户名
  84. EditText editText1 =findViewById(R.id.edt_pass);
  85. String pass = editText1.getText().toString();
  86. //模拟判断登录情况
  87. if(!user.equals(pass)){
  88. return;
  89. }
  90. Toast.makeText(this,"成功登录",Toast.LENGTH_SHORT).show();
  91. //1.获取界面对象
  92. CheckBox checkBox=findViewById(R.id.checkbox);
  93. //2.判断情况
  94. //checkBox.setOnCheckedChangeListener();
  95. if(checkBox.isChecked()){
  96. //保存用户名
  97. //String path="/data/data/com.bluelesson.a303/config.txt";
  98. String fileDir = getFilesDir().getPath();
  99. String path = fileDir+File.separator+"config.txt";
  100. File file=new File(path);
  101. try {
  102. FileOutputStream outputStream=new FileOutputStream(file);
  103. byte bytes[] = user.getBytes();
  104. outputStream.write(bytes);
  105. outputStream.clone();
  106. } catch (FileNotFoundException e) {
  107. e.printStackTrace();
  108. } catch (IOException e) {
  109. e.printStackTrace();
  110. }
  111. }
  112. }
  113. }

相关获取方法

image.png

◆数据存储方式2:外部存储(存储在SD卡中)

image.png

image.png

SD卡权限

image.png

关键代码

image.png

MainActivity.java

  1. package com.bluelesson.a303;
  2. import android.os.Environment;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.CheckBox;
  7. import android.widget.CompoundButton;
  8. import android.widget.EditText;
  9. import android.widget.Toast;
  10. import java.io.File;
  11. import java.io.FileInputStream;
  12. import java.io.FileNotFoundException;
  13. import java.io.FileOutputStream;
  14. import java.io.IOException;
  15. import java.io.InputStream;
  16. public class MainActivity extends AppCompatActivity {
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. //initCtrl();
  22. //initCheckBox();
  23. initCheckBox1();
  24. }
  25. //这个函数相当于同时实现了 initCtrl和initCheckBox两个函数的功能
  26. private void initCheckBox1() {
  27. //1.读取配置文件
  28. //获取用户名界面
  29. EditText editText =findViewById(R.id.edt_user);
  30. String user = editText.getText().toString();
  31. //读取配置文件中用户名,设置对象
  32. String path = Environment.getExternalStorageDirectory()+File.separator+"config.txt";
  33. File file=new File(path);
  34. int fileLen = (int)file.length();
  35. try {
  36. FileInputStream inputStream=new FileInputStream(file);
  37. byte bytes[] = new byte[fileLen];
  38. inputStream.read(bytes);
  39. inputStream.close();
  40. String s = new String(bytes);
  41. editText.setText(s);
  42. } catch (FileNotFoundException e) {
  43. e.printStackTrace();
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. //2.设置监听器写入配置文件
  48. //1.获取界面对象
  49. CheckBox checkBox=findViewById(R.id.checkbox);
  50. //2.设置监听器
  51. checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  52. @Override
  53. public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
  54. //获取用户名
  55. EditText editText =findViewById(R.id.edt_user);
  56. String user = editText.getText().toString();
  57. //保存用户名
  58. //String path="/data/data/com.bluelesson.a303/config.txt";
  59. //String fileDir = getFilesDir().getPath();
  60. String state = Environment.getExternalStorageState();
  61. //判断一下SD卡状态
  62. if(state.equals(Environment.MEDIA_UNMOUNTED)){
  63. Toast.makeText(MainActivity.this,"请插入SD卡",Toast.LENGTH_SHORT).show();
  64. return;
  65. }
  66. String path = Environment.getExternalStorageDirectory()+File.separator+"config.txt";
  67. File file=new File(path);
  68. try {
  69. FileOutputStream outputStream=new FileOutputStream(file);
  70. byte bytes[] = user.getBytes();
  71. outputStream.write(bytes);
  72. outputStream.close();
  73. } catch (FileNotFoundException e) {
  74. e.printStackTrace();
  75. } catch (IOException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. });
  80. }

◆Android中文件的访问权限

image.png

◆数据存储方式3:Shared Preferences(app目录下xml文件)