一、外部存储
1、我们通过 Environment.getExternalStorageDirectory().getAbsolutePath() 获取外部绝对路径
// 获取外部存储中名字叫imooc.txt的路径
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/imooc.txt";
//创建文件
File file = new File(path);
2、接着我们需要判断文件是否存在,如果不存在,就创建,存在就继续往下走
//判断文件是否存在
if (!file.exists()) {
file.createNewFile();
}
3、通过输出流写入自己想要写入的信息,这儿我写入的是字符串信息
try {
if (!file.exists()) {
file.createNewFile();
}
//建立输出流 ,这儿讲一下第二个参数 ,设为true 表示后面写入的数据会进行拼接 。举个例子 ,我第一次写入数据为:"Hello" ,第二次在写入数据 "World" ,最终就会拼接成 "Hello World" ,如果不想拼接 可以不填。
FileOutputStream fileOutputStream = new FileOutputStream(file, true);
String aaa = "哈哈哈哈哈哈哈";
//通过字节的方式写入数据
fileOutputStream.write(aaa.getBytes());
//写入完毕记得关闭输出流
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
4、这个时候就已经写入了,我们可以在Android 右下角点击DeviceFileExplorer 中查看 文件在sdcard 目录下
image.png
这就是我们刚才写入的imooc.txt 文件,这儿需要足以的是在Android 6.0 以后不但需要在AndroidManifest 中配置权限,还需要动态获取读写权限 在AndroidManifest.xml 文件中配置权限
而动态获取权限需要涉及到两个函数 ContextCompat.checkSelfPermission() 和 ActivityCompat.requestPermissions() ,其中 ContextCompat.checkSelfPermission() 作用: 检查是否拥有某个权限 , ActivityCompat.requestPermissions() 表示申请权限:
//申请动态权限
private void permission() {
//首先判断是否拥有某个权限 ,返回值为int 类型,如果值等于PackageManager.PERMISSION_GRANTED表示有这个权限,没有就申请
int i = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (i != PackageManager.PERMISSION_GRANTED) {
//申请权限有三个参数 参数一: 表示上下文。参数二 :表示权限的集合 参数三:表示状态码 用于onRequestPermissionsResult回调 ,就是对应onRequestPermissionsResult 中的requestCode
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
//XXXXXXXXXXX
}
}
然后在需要使用的地方调用即可。
5.读取文件中的信息 ,我们通过文件输入流读取 :
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/imooc.txt";
Log.e(TAG, "onCreate: " + path);
File file = new File(path);
try {
FileInputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
String string = new String(bytes, 0, read);
inputStream.close();
Log.e(TAG, "onCreate:1111 " + string);
} catch (IOException e) {
e.printStackTrace();
}
二、内部存储
内部存储和外部存储大致相同,就省略一些了:
image.png
//获取内部File路径 ,表示获取"getFileDir.txt" 路径, 内容存放在如上图
File file = new File(getFilesDir(), "getFileDir.txt");
try {
if (!file.exists()) {
file.createNewFile();
}
Log.e(TAG, "onCreate: " + "rennene");
FileOutputStream fileOutputStream = new FileOutputStream(file, true);
String aaa = "哈哈哈哈哈哈哈";
fileOutputStream.write(aaa.getBytes());
fileOutputStream.close();
FileInputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
inputStream.close();
String string = new String(bytes, 0, read);
Log.e(TAG, "onCreate:1111 " + string);
} catch (IOException e) {
e.printStackTrace();
}
代码基本上和上面相似,除了获取存储路径不同以外