啥是内部存储

内部存储位于系统中很特殊的一个位置,如果将文件存储在内部存储中,那么文件只能默认被你的应用访问到,并且同一个应用创建的所有文件都在相同的目录下。创建于内部存储的文件与应用相关联,应用卸载后文件也被删除。

内部存储所有内容都在安卓文件系统下的 data,其中 data 又有三个子目录:

data|- app|- data|- local
  • app 存放所有安装的app的apk文件
  • data 文件夹里面都是一些包名,这些包名和 build.gradle 中 applicationId 是一致的,也就是说你的应用的一些数据就在在这里
  • local 存放临时的缓存文件

我们重点关注 data文件。打开 Audio Studio --> View --> Tool Windows --> Device File Explorer,找到 data/data 文件夹,可以查看里头确实都是一些包名。

在内部存储中读写文件

写文件

在内部存储写文件时,首先要获得文件正确的路径,可以用下面两个方法:
getFilesDir(): 返回存放应用文件的路径
getCacheDir(): 返回存放应用临时缓存的路径

结合文件名和上面的两种方法,得到正确的文件路径,然后打开文件进行写入操作。例如

String filename = "test.txt";
File file = new File(getFilesDir(), filename);
try {FileOutputStream outputStream = new FileOutputStream(file);
} catch (Exception e) {e.printStackTrace();
}

或者,用 openFileOutput() 来直接获得一个 FileOutputStream,例如:

try {FileOutputStream outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
} catch (Exception e) {e.printStackTrace();
}

注意,openFileOutput 需要一个文件模式参数。MODE_PRIVATE 表示这个文件是这个应用私用的文件,外部不可访问。其他的文件模式有 MODE_WORLD_READABLEMODE_WORLD_WRITEABLE 已经在安卓7.0后被弃用了。如果你的app要分享私有文件,那么可以使用 FileProvider,这个我们下次再聊。

读文件

读文件的操作与写文件类似,不再累述,直接上代码:

String filename = "test.txt";
File file = new File(getFilesDir(), filename);
try {FileInputStream inputStream = new FileInputStream(file);
} catch (Exception e) {e.printStackTrace();
}

或者用 openFileInput,注意这里不需要文件模式参数

try {FileInputStream inputStream = openFileInput(filename);
} catch (Exception e) {e.printStackTrace();
}

小例子

ok,我们已经掌握了在内部存储读写文件的所有内容了,现在来做一个小作业,用上我们学到的知识。
需求是这样,做一个下图样式的app,在文本框里输入文字,点击Save将文件保存至文件,点击Read将保存的文件读入并显示在文本框里。

具体如何做就不一一细说了,直接上代码

MainActivity.java

package com.bytedance.writeandreadoninternalstorage;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private static final String filename = "test.txt";private Button saveButton;private Button readButton;private EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);saveButton = findViewById(R.id.save);readButton = findViewById(R.id.read);editText = findViewById(R.id.editText);}public void onSaveClicked(View view) {try {FileOutputStream outputStream = openFileOutput(filename, Context.MODE_PRIVATE);String text = editText.getText().toString();outputStream.write(text.getBytes());Toast.makeText(this, "Save success!", Toast.LENGTH_SHORT).show();} catch (Exception e) {e.printStackTrace();}}public void onReadClicked(View view) {try {FileInputStream inputStream = openFileInput(filename);byte[] bytes = new byte[1024];int hasRead = inputStream.read(bytes);editText.setText(new String(bytes, 0, hasRead));Toast.makeText(this, "Read success!", Toast.LENGTH_SHORT).show();} catch (Exception e) {e.printStackTrace();}}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="8dp"android:hint="Enter..."android:maxLines="20"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/save"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="8dp"android:layout_marginTop="16dp"android:layout_marginEnd="8dp"android:text="Save"android:onClick="onSaveClicked"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintEnd_toStartOf="@+id/read"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/editText" /><Buttonandroid:id="@+id/read"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:text="Read"android:onClick="onReadClicked"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.5"app:layout_constraintStart_toEndOf="@id/save"app:layout_constraintTop_toBottomOf="@id/editText" /></androidx.constraintlayout.widget.ConstraintLayout>

参考资料

  • Save files on device storage

安卓小课堂之:读写文件(内部存储)相关推荐

  1. android studio文件内部存储,Android Studio使用内部存储上的文件创建diconary

    即时通讯工具正在Android的Notes应用程序中使用. 问题:我不知道如何保存txt.我的内部存储上的应用程序文件.我已经用外部存储编码了它.这里是我的代码(MainActivity.java)A ...

  2. Android手机数据读写方法(内部存储、SD卡,网络加载,包内文件读取)

        本次实例以文本和图片为例,展示了Android手机内部存储的读写方法.SD卡的读写方法,包内文件的读取,以及网络文本及图片的加载与下载.     项目文件在此:文档下载传送门 从网络加载图片或 ...

  3. python用with读文件的好处_python小课堂39 - 用 with 优雅的读写文件

    python小课堂39 - 用 with 优雅的读写文件 前言 本篇来介绍一下 Python 中的关键词 with 的小技巧.但是在了解 with 之前,需要先了解一下如何使用 Python 对文件进 ...

  4. Android 文件外/内部存储的获取各种存储目录路径

    前言 对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定是必不可少的.对于很多做Android开发的同学来说,可能认为文件存储很简单,调用一些诸如getFilesDir,getEx ...

  5. 转--Android 文件外/内部存储的获取各种存储目录路径

    前言 对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定是必不可少的.对于很多做Android开发的同学来说,可能认为文件存储很简单,调用一些诸如getFilesDir,getEx ...

  6. 转:彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑

    转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定 ...

  7. Android文件存储---内部存储,外部存储以及各种存储路径解惑

    本文转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储 ...

  8. c语言采用文件存储数据,C语言读写文件大全 之 基础篇

    一直想着把C语言和C++关于文件操作的相关内容总结一下,这样在使用的时候就可以顺手拈来,嗯,这就是好记性不如烂笔头.既然是文件操作,那么开篇就从"文件"的介绍开始. 1.文件 文件 ...

  9. android 内部 存储空间不足,解决安卓手机内部存储不足的方法原来这么简单,瞬间多了好几个G...

    自从安卓4.0版本后,大部分的手机应用都只能安装于手机内部存储卡.对于内部存储小的手机来说这是很尴尬的,虽然插了外置MicroSD卡,效果也不理想. 下面简单几个操作瞬间就能为你的手机内部存储腾出大大 ...

最新文章

  1. 最大后验概率和极大似然
  2. Stanford机器学习笔记-6. 学习模型的评估和选择
  3. LinearLayout和RelativeLayoutnbs…
  4. Storm累计求和Demo并且在集群上运行
  5. CSS DIV Shadow
  6. 字符串处理 —— 概述
  7. 怎样用谷歌network调试接口_前端-chromeF12 谷歌开发者工具详解 Network篇
  8. poj 3368 Frequent values rmq
  9. windows安装配置jdk1.8
  10. Unity制作3d生存游戏视频教程
  11. 【盘点】2017杭州云栖大会迁云实战Workshop
  12. python print 格式化输出
  13. 【中亦安图】小机上运行Oracle需要注意的进程调度bug(1)
  14. 8 种方案机智应对后端一次性返回 10万 条数据
  15. Java实现 洛谷 P1159 排行榜
  16. 学习Linux的几点忠告(转贴)
  17. 嵌入式主板广泛的解决方案
  18. PCIe设备的配置过程
  19. 人身三流指什么_关于《三流人生》那些事儿
  20. 如何查看哪些进程占用了网速

热门文章

  1. Java方法01 方法(函数)定义、调用、值传递、重载、命令行传递参数
  2. linux网络流量监测工具,linux下网络流量监控工具
  3. linux 读取 gateway ip socket,linux下获取本地IP信息(没看代码)
  4. 0分配不到地址_图解 Go 内存分配器
  5. Jmeter通过CSV Data Set Config参数化
  6. python 内部收益率_python – IRR实现中使用的数值方法是什么?
  7. 进入环境_大学新生,进入新环境该怎样和舍友、同学相处
  8. git对指定commitid 打tag_Git-命令行-使用 Tag 标记你的代码
  9. 开发浏览器监控网页数据变化_贝程学院:Selenium辅助开发工具Firebug和Firepath
  10. 采用FTP协议实现文件的上传