一.Android整个储存空间分为内部存储和外部存储两部分
- 内部储存:即InternalStorage,也就是内置存储卡,这是手机内置的存储空间
- 外部存储:即ExternalStorage,也就是外置存储卡,如sd卡。
- data文件夹就是我们常说的内部存储。外部存储一般就是我们下面看到的storage文件夹,当然也有可能是mnt文件夹。
4.内部存储,在data文件下,一个app文件夹,一个时data文件夹是需要关注的。app文件夹存放apk文件;data文件夹存放这,在使用sharedPreferenced的时候,将数据持久化存储于本地,其实就是存在这个文件中的xml文件里,App里边的数据库文件就存储于databases文件夹中,还有我们的普通数据存储在files中,缓存文件存储在cache文件夹中。
使用:getCacheDir()方法用于获取/data/data//cache目录
getFilesDir()方法用于获取/data/data//files目录
4.外部存储
一般来说,在storage文件夹中有一个sdcard文件夹,这个文件夹中的文件又分为两类,一类是公有目录,还有一类是私有目录。使用:Environment.getExternalStorageDirectory().getAbsolutePath()+"/hanjie.txt";
Environment.getExternalStorageDirectory()方法是获取外部存储的公有文件的路径。getAbsolutePath()获取的是绝对路径。/hanjie.txt是文件名。
二:总结
1.Android系统私有的外部存储,也就是与此app相关的内容,是随着应用程序的卸载而卸载的,公有的外部存储则不会。
2.Android中操作外部存储时需要添加读写外部存储的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
3.注意:在AndroidAPI6.0之后,根目录文件存储时需要用户授权,即使在AndroidManifest.xml文件中配置了存储权限,也需要动态授权,用户不受权是无法使用的
三:外部存储案例
1.效果,先将数据保存,再将数据读取
2.在文件夹中查看保存的文件
3.代码
3.1.ExternalActivity代码
package com.hanjie.datastorage_2021_0414;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExternalActivity extends AppCompatActivity {
private EditText infoEdt;
private TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_external);
infoEdt = findViewById(R.id.info_edt);
txt = findViewById(R.id.textView);