原创 Android之文件存储

2021-7-22 16:18 2613 11 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

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

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

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

不错
相关推荐阅读
大鸟科创空间 2022-02-14 17:42
生日快乐HTML浪漫网页制作源码
对象生日快到了,赶快下载去给ta一个惊喜吧。解压后里面有整个项目和使用说明。这个代码有背景音乐(可以自己更改),有自转相册(可以改成对象照片)如下是效果截图,用鼠标滑动界面会有爱心划过,下滑可以循环播...
大鸟科创空间 2022-01-18 18:06
Android之WebView用法
除了HTTP通信与 Socket 通信两种主要的网络技术外,在 Android 中还提供了一种加载和显示网页的技术—WebView。这可以让我们去处理一些特殊的需求,比如像微信那样在应用程序里展示网页...
大鸟科创空间 2022-01-07 14:18
Android之Socket实例
    Socket(套接字)是对 TCP/IP 协议的封装和应用,根据底层封装协议的不同,Socket 的类型可以分为流套接字(streamsocket)和数据报套接字(data...
大鸟科创空间 2021-12-24 14:38
Android之本地广播的使用
前面我们发送和接收的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数...
大鸟科创空间 2021-12-15 12:50
自定义广播实例
我们应该已经学会了通过广播接收者来接收系统广播的内容,但是在实际开发中,仍需要自定义一些广播。下面我们就来讲解如何在应用程序中发送自定义的广播。发送广播很简单,只需要声明一个意图,然后使用Contex...
大鸟科创空间 2021-12-07 13:04
Android之动态注册广播实例
Android内置了很多系统级别的广播,我们可以在应用序中通过监听这些广播来得到各种系统的状态信息,比如手机开机完成后会发出一条广播、电池的电最发生变化会发出一条广播、时间或时区发生改变也会发出一条广...
EE直播间
更多
我要评论
1
11
关闭 站长推荐上一条 /3 下一条