内容目录 持续更新中。。。
Internal存储
简介
1.Internal存储区是确保不被用户和其他app所访问的最佳存储区域。
2.app的内部存储区的目录在Android文件系统的指定目录下,由你的app的包名命名,通常为data/data/app_name/ 。
3.对于内部存储区的文件的读写,不需要向系统申请权限。
具体代码
即保存几个步骤创建流,打开文件,写入内容,关闭流
public class MainActivity extends AppCompatActivity {
EditText edit1 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit1 = findViewById(R.id.edit_Inter_inputstr);
}
public void btnSaveClick(View view) {
//要保存信息所在的文件名
String filename = "myfile.txt";
String savestr = edit1.getText().toString().trim();
//开始准备保存信息
FileOutputStream outputStream = null;
try {
//私有方式打开文件,不进行追加
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
//写入文件信息,把String转化成二进制数组
outputStream.write(savestr.getBytes());
//关闭流
outputStream.close();
Toast.makeText(MainActivity.this, R.string.strsucc, Toast.LENGTH_LONG).show();//保存成功
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, R.string.strfail, Toast.LENGTH_LONG).show();//失败了
}
}
即读取几个步骤创建流,打开文件,将数据流读入到二进制数组中,关闭流,将数组转化为字符
public void btnReadClick(View view) {
FileInputStream inputStream = null;
try {
//打开文件
inputStream = openFileInput("myfile.txt");
//准备存放打开的文件,byte的长度是流可用的长度
byte[] butter = new byte[inputStream.available()];
//把流读入到数组里面
inputStream.read(butter);
//关闭流
inputStream.close();
//把数组转化成字符
String str1 = new String(butter);
edit1.setText(str1);
Toast.makeText(MainActivity.this, R.string.strsuc, Toast.LENGTH_LONG).show();//读取成功了
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, R.string.strfail, Toast.LENGTH_LONG).show();//失败了
}
}
}
当然可以再建一个EditText,自己输入文件名,对应的代码改为:
String fileName = edit1.getText().toString().trim();
edit3.setText(getDir(edit1.getText().toString().trim(), MODE_PRIVATE).getAbsolutePath() + "&&" + str1);//多加一个获取路径
经过验证,内部存储在app重构时不会消失,可通过文件名反复读取,但当删除后重新安装,之前存储的文件就会消失,无法读取。
页面展示
1.既定文件名
2.自定义文件名加获取路径,且如图所示对应介绍第二条文件名的一般格式
External存储
简介
1.不是总可用的,由于用户可以将USB存储mount 为external存储,在某些情况下会从设备中移除。
2.是world-readable的,因此存在这里的文件,它的读取不受你的控制。
3.当用户卸载你的app的时候,系统移除你app在通过getExternalFilesDir()方法取到的目录中的文件。
具体代码
首先需要在Mainfest中获取权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
存操作分三步:创建文件夹,创建文件,写入内容
public class BBActivity extends AppCompatActivity {
EditText edit1, edit2, edit3 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bb);
edit1 = findViewById(R.id.edit_Dir);
edit2 = findViewById(R.id.edit_fliename);
edit3 = findViewById(R.id.edit_flieCon);
}
/* 判断是否可读写 */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
//写一个方法在指定的文件目录下创建一个文件夹
public File getExternalDir(String _Dirname) {
File strdir = Environment.getExternalStoragePublicDirectory(_Dirname);
if (!strdir.mkdir()) {
Log.d("", "---创建失败---");
}
return strdir;
}
public void External_Save_Click(View v){
//判断外部存储是否可用
if (isExternalStorageWritable()){
//在指定的位置创建文件夹,edit1.getText().toString().trim()即上面方法中的_Dirname
File dirname=getExternalDir(edit1.getText().toString().trim());
//判断文件夹是否创建成功
if (dirname!=null){
String fileName=edit2.getText().toString().trim();
String fileCon=edit3.getText().toString().trim();
File file=new File(dirname,fileName); //⭐
FileOutputStream outputStream=null;
try {
//打开
outputStream=new FileOutputStream(file); //⭐
outputStream.write(fileCon.getBytes());
outputStream.close();
Toast.makeText(BBActivity.this, R.string.strsucc, Toast.LENGTH_LONG).show();//保存成功
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
读取操作,与内部存储相似
public void GetFromFile(View view) {
//判断一下外部存储的可用性
if (isExternalStorageWritable()) {
//获取所在的文件夹位置
File Dirname = getExternalDir(edit1.getText().toString().trim());
if (Dirname != null) {
//准备获取读取的文件内容
//找到读取的文件名
String Filename = edit2.getText().toString().trim();
//声明一个字符串,等待接收内容
String FileContent = ""