原创 Android之文件存储

2021-7-22 16:18 427 4 2 分类: 软件与OS 文集: android studio

利用 SharedPreferences 来保存数据固然有其简单轻便的优势,但是当数据较大时使用 SharedPreferences 合适了,此时一般选择使用文件存储。

在应用私有文件夹中读写数据

在介绍如何在Android 平合下进行文件存储之前有必要了解 Android 平台下的数据存储规则。在其他的操作系统如 Windows 平台下,应用程序可以自由地或者在特定的访问权限基础上访问或修改其他应用程序名下的文件等资源,而           Android 平台下,一个应用程序中所有的数据都是私有的。

当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数据,只有这个应用程序才有对这个文件夹的写入权限,这个私有的文件夹位于 Android 系统的"data\data\<包名>files\"目录下,其他的应用程序都无法在这个文件夹中写入数据。除了存放私有的数据文件夹外,应用程序也具有 SDCard卡的写入权限。

使用文件I/O 方法可以直接往手机中存储数据,默认情况下这些文件不可以被其他应用程序访问。Android 平台支持 Java 平台下的文件 I/O 操作,主要使用 FilelnputStream FileOutputStream 这两个类来实现文件的存储与读取。获取这两个类对象的方式有两种。

第一种方式就是像 Java平台下的实现方式一样通过构造器直接创建,如果需要向打开的文件末尾写入数据,可以通过使用构造器 FileOutputStreamFile fileboolean append)将 append设置为 true 来实现。

第二种获取 FileInputStream FileOutputStream 对象的方式是调用 Context.openFilelnputString filename)和 Context.openFileOutputString nameint mode)方法来创建。

在实际的 Android 开发实践中,使用第二种方式的并不多,在以往的 Android 开发类书籍里也很少有人提及这种方式。这是因为在前几年的环境下 Android 手机的机身内存还是较小的,需要借助于 SDCard,多数的文件读写操作都是针对 SDCard 的,而它只能读写位于"\data\data\<包名>\files\"下的文件,所以这种文件操作方式肯定是不合适的。但是,发展到今天,Android 手机的机身内存已足够大,不需要外加 SDCard,甚至很多手机都已经不支持 SDCard 了。智能手机的发展使得这种操作文件读写的方式变得实用了。

相信读者在 Java SE 的学习中已经熟悉了第一种方式,所以这里主要以第二种方式来进行实例讲解。其中,Context 对象提供的几个主要用于对文件操作的方法方法名

openFilelnput(String filename)

打开应用程序私有目录下的指定私有文件以读入数据,返回一个FilelputStream 对象

openFileOutput(String name,it mode)

打开应用程序私有目录下的指定私有文件以写入数据,返回一个

FileOutputStream 对象,如果文件不存在就创建这个文件

搜索应用程序私有文件夹下的私有文件,返回所有文件名的 String 数组

deleteFile(String fileName)删除指定文件名的文件,成功返回true,失败返回 false

在上述方法中,openFileOutputString namein t mode)的第二个参数指的是读取权限,这里的权限参数和 SharedPreferences 的参数一样,有如下 4

Conext.MODE_PRVATE∶指定 ShardPrefreces 数据只能被本应用程序读、写。Comex.MODE_APPEND∶检查文件是否存在,存在就向文件中追加内容,否则创建新文件

Conext.MODE_WORLD_READABLE∶指定 SharedPrefernces 数据能被其他应用程序读,但不能写。

Context.MODE_WORLD_WRITEABLE∶指定 SharedPreferences数据能被其他应用程序读、写

下面用实例来说明Android平台下的文件IO 操作方式,主要实现的功能很简单,就是在应用程序私有的数据文件夹下创建一个文件并读取其中的数据显示到屏幕的TextView中。在实例中,包括一个Activiy类和对应的布局文件,以及一个文件读写类。在Activity 中操作该文件读写类,先将文本写入文件,再从文件中读出来并展示到TextView 中。

布局文件代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <TextView
  9. android:id="@+id/filetext"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:textSize="25dp"/>
  13. </RelativeLayout>
  14. Activity代码如下:
  15. package com.rfstar.filesavetest;
  16. import androidx.appcompat.app.AppCompatActivity;
  17. import android.os.Bundle;
  18. import android.widget.TextView;
  19. public class MainActivity extends AppCompatActivity {
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. String message="大家好,这里是大鸟科创空间";
  25. HandFile handFile=new HandFile(this);
  26. handFile.writeFileData("file",message);
  27. String result=handFile.readFileData("file");
  28. TextView textView=(TextView)findViewById(R.id.filetext);
  29. textView.setText(result);
  30. }
  31. }
  32. 文件读写类代码如下:
  33. package com.rfstar.filesavetest;
  34. import android.content.Context;
  35. import java.io.FileInputStream;
  36. import java.io.FileNotFoundException;
  37. import java.io.FileOutputStream;
  38. public class HandFile {
  39. private Context context;
  40. public HandFile(Context context){
  41. this.context=context;
  42. }
  43. public void writeFileData(String filename,String message)
  44. {
  45. try{
  46. FileOutputStream fileOutputStream=context.openFileOutput(filename,
  47. context.MODE_PRIVATE);
  48. byte[] bytes=message.getBytes();
  49. fileOutputStream.write(bytes);
  50. fileOutputStream.close();
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. public String readFileData(String fileName)
  56. {
  57. String result="";
  58. try{
  59. FileInputStream fileInputStream=context.openFileInput(fileName);
  60. int length=fileInputStream.available();
  61. byte[] buffer=new byte[length];
  62. fileInputStream.read(buffer);
  63. result=new String(buffer);
  64. fileInputStream.close();
  65. }catch (Exception e)
  66. {
  67. e.printStackTrace();
  68. }
  69. return result;
  70. }
  71. }

实例代码中的新方法和逻辑以及实现的功能在前文都已经叙述了。运行程序,效果如下:

android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。

作者: 大鸟科创空间, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3949041.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论1条评论)

登录后参与讨论

商业资讯 2021-8-2 11:41

不错
相关推荐阅读
大鸟科创空间 2021-09-14 15:25
Android之读取通话记录实例
在Android 中提供了很多系统ContextProvider,通话记录就是其中的一个典型代表。下面我们以读取通话记录为例,展示如何读取系统自带的 ContextProvider 以及动态权限的处理...
大鸟科创空间 2021-09-02 15:01
Android之自定义 ContentProvider
在学习了ContentProvider 的几个常用类和如何创建一个内容提供者的方法之后,下面我们用一个实例来进一步加深理解。通过一个完整的实例来展示如何用ContentProvider类进行数据库操作...
大鸟科创空间 2021-08-27 12:30
Android之ContentProvider
在Android开发中,有时用户确实需要在应用之间进行数据的交换。我们知道通过指定文件的操作模式为 Context.MODE_WORLD_READABLE或 Context.MODE_WORLD_WR...
大鸟科创空间 2021-08-13 14:01
Android之SQLite 操作实例
下面通过一个完整的实例来展示如何进行数据库操作。由于实例中使用的方法在上一篇博文中都已经讲述过,因此不再对具体的方法进行分析,主要通过完整的实例让读者有一个宏观的认知实例将通过创建 100条模拟数据,...
大鸟科创空间 2021-07-26 17:01
SQLite操作的核心类 SQLiteDatabase 与 SQLiteOpenHelper
在 Android 中,操作SQLite主要依靠SQLiteDatabase与 SQLiteOpenHelper 这两个类,其中 SQLiteDatabase 是用于执行数据库操作的类,SQLiteO...
广告
我要评论
1
4
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /3 下一条