今天我们来学习下文件存储。文件存储算是Android中最为基础的一种数据存储方式了。它比较适合用于存储一些简单的文本数据后二进制数据。
那么我们就先来看下Android是如何通过文件来保存数据的

将数据存储到文件中

首先,我们需要创建一个新的项目,并修改activity_main.xml文件。我就直接上代码了,毕竟挺简单的。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"><EditTextandroid:id="@+id/edit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="4"android:hint="在这里输入内容"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="保存" /></LinearLayout>

代码比较简单,我们创了一个EditText和Button。EditText用于输入文本内容。Button用于实现保存数据到文件之中。等你输入完你的内容,按下保存键,这样你输入的内容就会在回收前存储到文件之中去。

然后,我们就要写主要代码了。一样的,直接上代码。

public class MainActivity extends AppCompatActivity {private EditText edit;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);edit = findViewById(R.id.edit); //得到文本输入框的控件Button btn1 = findViewById(R.id.button); //得到保存按钮的控件//保存按钮的点击事件btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取edit中的数据String inputText = edit.getText().toString().trim();//调用保存数据方法save(inputText);}});
}public void save(String  inputText){FileOutputStream out = null;BufferedWriter writer = null;try {out=openFileOutput("data", Context.MODE_PRIVATE);writer = new BufferedWriter(new OutputStreamWriter(out));writer.write(inputText);} catch (IOException e) {e.printStackTrace();}finally {try {if(writer != null) {writer.close();}} catch (IOException e) {e.printStackTrace();}}}
}

这里我们调用了content类中的openFileOutput()方法,可以用于把数据存储到指定的文件中去。这个方法有两个参数,第一个参数是文件名(注意:文件名不可以包含路径),所有文件都是默认存储在 /data/data/<包名>/files/目录下面。第二个参数是文件的操作模式,主要有两种模式,一个是MODE_PRIVATE,一个是MODE_APPEND。其中MODE_PRIVATE是默认模式,表示覆盖文件的内容。而MODE_APPEND是如果改文件存在就往改文件里追加内容,如果不存在,就创建新文件。其实还有另外两种但不能用了,被Android4.2版本抛弃了。
上面的代码还是比较容易理解的,我们通过openFileOutput来得到一个FileOutputStream对象,再通过FileOutputStream对象来创建一个OutputStreamWriter对象,在使用OutputStreamWriter对象创建一个BufferedWriter对象。这样我们就能够通过BufferedWriter来讲文件内容写入到文件中。
大体的转化是这样的:openFileOutput --> FileOutputStream --> OutputStreamWriter --> BufferedWriter
以上我们的将数据存储到文件中的代码就写完了。我们可以在下图中看到我们输入的内容。

从文件中读取数据

刚刚我们往文件中存储了数据,现在我们来把我们刚刚存进去的数据读取出来。
和数据存储到文件中一样,Content类中提供了openFileInput()方法,它用于从文件中读取数据。它比openFileOutPut简单点,他只有一个参数,就是你要读取的文件名。然后系统就会去/data/data/<包名>/files/目录下加载这个文件,并返回一个FileInputStream对象,然后在通过io留的方式将数据读取出来。这里要注意的是,读取必须和存储在同一个项目中,如果在不同的项目中,他们的路径不一样,会找不到你要的文件。

那我们就开始完善一下之前的代码,同样的,我们先修改Activity_main.xml文件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"><EditTextandroid:id="@+id/edit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="4"android:hint="在这里输入内容"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="保存" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_weight="1"android:layout_height="wrap_content"android:text="读取" /></LinearLayout>

我们只是在文件中加了一个读取的按钮,这里也很简单不需要过多的讲解。

接下来就是MainActivity代码了。

public class MainActivity extends AppCompatActivity {private EditText edit;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);edit = findViewById(R.id.edit);Button btn2 = findViewById(R.id.button2);btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String inputText = load(); //用字符串转读取到的内容if(!TextUtils.isEmpty(inputText)){ //判断内容是否为空 edit.setText(inputText); //把内容用输入框显示edit.setSelection(inputText.length()); //将输入光标移到到文本的最后,以便继续输入Toast.makeText(MainActivity.this,inputText,Toast.LENGTH_SHORT).show(); // 弹出读取的内容}}});}public String load(){FileInputStream in = null;BufferedReader reader = null;StringBuilder sb = new StringBuilder();  //创建一个StringBuilder对象try {in = openFileInput("data"); //得到你要读取的文件名reader = new BufferedReader(new InputStreamReader(in)); //读取文件内容String line ="";while ((line = reader.readLine()) !=null){sb.append(line); //将读取到的内容放到StringBuilder对象中}} catch (Exception e) {e.printStackTrace();}finally {if(reader != null){try{reader.close();} catch (IOException e) {e.printStackTrace();}}}return  sb.toString(); //返回读取的内容
}
}

在这段代码中,我们先通过openFileInput()获取到FileInputStream对象,然后借助FileInputStream对象创建一个InputStreamReader对象,再用InputStreamReader对象创建一个BufferedReader对象,这样我们就通过BufferedReader一行一行的进行读取,在把文件中的内容读取出来,放在StringBuilder对象中,最后将读取的内容返回。我们在读取按钮的点击事件中,得到读取的内容,并把内容用输入框和弹出来显示。
大体的转化为:openFileInput --> FileIntputStream --> IntputStreamReader --> BufferedReader --> BufferedReader

读取的代码我们也写完了。现在我们来看下整体的效果。

文件存储我们就这样讲完了,用到的核心技术就是Content类中的openFileInput( )和openFileOutput(),再用io流的方式来进行操作,你懂了嘛?

数据存储机制之文件存储相关推荐

  1. Android的数据存储:SharedPrefrence存储,手机内部文件存储,手机外部文件存储

    存储方式分类 Android支持的数据存储方式:SharedPrefrence存储手机内部文件存储手机外部文件存储Sqlite数据库存储远程服务器存储 SharedPrefrence存储 介绍 SP存 ...

  2. TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和 tf.data.Dataset机制

    TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和tf.data.Dataset机制 之前写了一篇博客,关于<Tensorflow生成自己的 ...

  3. CC00023.hadoop——|HadoopHive.V23|——|Hive.v23|Hive存储机制之行列存储及TextFile.v01|

    一.数据存储格式 ~~~ [Hive存储机制之行列存储及TextFile] ~~~ [Hive存储机制ORC] ~~~ [Hive存储机制之Parquet] ~~~ [Hive元数据之文件格式对比] ...

  4. 腾讯云常见云产品中的云硬盘(块存储)、文件存储、对象存储三者的区别!

    云硬盘.文件存储.对象存储,三种都是存储的,对于刚接触的同学来说,感觉好绕呀,这三种有啥子区别,什么时候应该用云硬盘?什么时候应该用文件存储?什么时候应该用对象存储? 对于使用过的老手,那肯定是可以区 ...

  5. 阿里云存储价格对象存储OSS、文件存储NAS和块存储收费标准

    阿里云云存储怎么收费?云存储1GB空间容量多少钱?如果是OSS对象存储1GB价格是0.12元/GB/月,标准存储包1TB一年价格999元:NAS文件存储100GB价格是30元一个月,500G空间150 ...

  6. 【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 )

    文章目录 一.Android 10 以前的存储机制 二.Android 10 及以后的分区存储机制 三.Android 10 中的存储过渡方案 四.文件索引数据库 五.相关文档资料 一.Android ...

  7. 数据存储方案(一) - 文件存储、SharedPreferences存储

    目录 文件存储 保存数据 保存输入框中的数据 读取数据 SharedPreferences存储 获取SharedPreferences对象 使用SharedPreferences保存数据 读取Shar ...

  8. mysql中的存储机制_Mysql的存储引擎

    MySQL的存储引擎存储引擎是什么?MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选 ...

  9. android 文件存储 集合,Android 文件存储的基本使用

    在Android中我们大多数情况下我们用的都是绝对路径: 文件存储位置说明: 内部存储不是内存,内部存储位于系统中很特殊的一个位置,当应用被卸载后,内部存储的文件夹也被删除,一个应用所创建的所有文件都 ...

最新文章

  1. 第29月第21天 ios android curl
  2. SQL优化常用方法10
  3. java runtime shell_java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现...
  4. Alphabet以3.8亿美元收购董事格林创业公司Bebop
  5. adb shell input text 完美支持中文输入
  6. where和having的区别
  7. 【TensorFlow-windows】keras接口——卷积核可视化
  8. python自动寻路模板_Python实现的简单模板引擎功能示例
  9. GitHub For Beginners: Don’t Get Scared, Get Started
  10. 如何用1年时间获得3年成长?
  11. Oracle 备份与恢复学习笔记(14)
  12. 如何查找识别苹果无线鼠标/无线键盘/触控板的设备序列号
  13. 保留(私有)地址简介
  14. excel冻结行和列_Spire.Cloud.Excel 冻结或解除冻结Excel中的行和列
  15. 【windows——工具篇】哔哩哔哩快捷键
  16. Arduino servo库函数说明(舵机函数库)
  17. 【福利】邀请博主,赢取大奖
  18. HashMap为什么用红黑树而不用跳表?redis的zset为什么用跳表而不用红黑树?
  19. html5论文期刊类参考文献,杂志论文参考文献格式
  20. $.ajax() 参数详解

热门文章

  1. 超短线炒股:勿以善小而不为,勿以恶小而为之
  2. Java面向对象系列[v1.0.0][SQL语法之数据库约束]
  3. 常用oid节点_Oid配置、解析方法、ors客户端、oid节点及其数据库的制作方法
  4. python的pygame模块详解_python游戏模块学习之pygame常规操作讲解
  5. Linux下c语言创建文件目录
  6. 爬取豆瓣电影 Top250 电影并存储到 Excel 表中
  7. 【Python】【实战】对 excel 某列进行统计,并按出现频率排序
  8. python简单的计算方法,【python入门级课程】做一台简单的计算器
  9. 5、day05音频 | How does audio works ?
  10. JAVA——写入指定文本内容(字符)