外部存储ExternalStorage
首先要分请一下几个概念:
内存 Memory
内部存储 InternalStorage
外部存储 ExternalStorage
(请自行百度一下)
直接来看一下效果吧:
一、一个简单的editText输入数据,一个textview显示输入的数据(我之前有做测试所以后面的文档内容比较随意)
二、下面我先贴一个xml的代码:
1、其中两个button的onclick都是oprate方法:之后在.java中调用时会用到switch(view.getid)去做选择,所以这里说明一下:
2、.java代码:
package com.example.shujucuncu;
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.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
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 ExternalStorage extends AppCompatActivity {
private EditText Edit;
private TextView show_txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_external_storage);
Edit = findViewById(R.id.Edit);
show_txt = findViewById(R.id.show_txt);
}
public void operate(View view) {
//创建文件路径
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Documents/ex.txt";
Log.d("xxx",path);
switch (view.getId()) {
case R.id.save_btn:
//创建一个文件
File file = new File(path);
try {
//判断文件是否存在,没有存在则创建一个新的文件
if (!file.exists()) {
file.createNewFile();
}
//创建一个文件输出流,写入文件是一个输出流(参数一 路径 参数二 是否增加txt)
FileOutputStream fos = new FileOutputStream(path, true);
//创建一个字符串是去get输入框的内容
String str = Edit.getText().toString();
//将str写入fos,write的类型是byte所以要getBytes()
fos.write(str.getBytes());
} catch (IOException ioException) {
ioException.printStackTrace();
}
break;
case R.id.read_btn:
try {
//创建一个输入流文件
FileInputStream fis = new FileInputStream(path);
//byte类型的数组,长度为1024
byte[] b = new byte[1024];
//read();方法会将读取到的字节存入缓存数组b,并且return一个int类型的已经读取过字节的数组b的长度所以在这里我们定义的是一个int类型的len;
int len = fis.read(b);
String str2 = new String(b, 0, len);
show_txt.setText(str2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException ioException) {
ioException.printStackTrace();
}
break;
}
}
}
3、代码涉及到输入流与输出流所以要在AndroidManifest.xml中设置权限代码:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
问题
这段代码在虚拟机上运行没有问题,但在真机测试上还存在问题不能运行,我还在查找解决办法,之后会在追加在这里,所以如果你有解决办法请一定给我留言🙏
上述问题解决方法
之前我的问题在于直接用Environment.getExternalStorageDirectory() 目录,Android 在最新几个版本存储这块控制得很严,将它改成getExternalCacheDir() 目录就可以。还是将修改后的代码贴出来:
package com.example.shujucuncu;
import android.Manifest;
import android.content.Context;
import android.content.IntentFilter;
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.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
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 ExternalStorage extends AppCompatActivity {
private EditText Edit;
private TextView show_txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_external_storage);
Edit = findViewById(R.id.Edit);
show_txt = findViewById(R.id.show_txt);
checkNeedPermissions();
}
//动态权限的方法 手机版本6.0以上要动态的申请手机权限
private void checkNeedPermissions() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//多个权限一起申请
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
}, 1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
//处理请求码为1时的权限处理
}
}
public void operate(View view) {
File file = new File(getExternalCacheDir(), "ex.txt");
Log.d("yyy", String.valueOf(file));
//存储的路径为:/storage/emulated/0/Android/data/com.example.shujucuncu/cache/ex.txt
switch (view.getId()) {
case R.id.save_btn:
try {
//判断文件是否存在,没有存在则创建一个新的文件
if (!file.exists()) {
file.createNewFile();
}
//创建一个文件输出流,写入文件是一个输出流(参数一 路径 参数二 是否增加txt)
FileOutputStream fos = new FileOutputStream(file);
//创建一个字符串是去get输入框的内容
String str = Edit.getText().toString();
//将str写入fos,write的类型是byte所以要getBytes()
fos.write(str.getBytes());
fos.flush();
fos.close();
Toast.makeText(ExternalStorage.this, "save success", Toast.LENGTH_SHORT).show();
} catch (IOException ioException) {
ioException.printStackTrace();
}
break;
case R.id.read_btn:
try {
//创建一个输入流文件
FileInputStream fis = new FileInputStream(file);
//byte类型的数组,长度为1024
byte[] b = new byte[1024];
//read();方法会将读取到的字节存入缓存数组b,并且return一个int类型的已经读取过字节的数组b的长度所以在这里我们定义的是一个int类型的len;
int len = fis.read(b);
String str2 = new String(b, 0, len);
show_txt.setText(str2);
fis.close();
Toast.makeText(ExternalStorage.this, "read success", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException ioException) {
ioException.printStackTrace();
}
break;
}
}
}