Android存储概念
分为内部存储和外部存储
内部存储
内部存储随应用卸载被删除
/data/data//shared_prefs
… /databases
… /files context.getFilesDir()
… /cache context.getCacheDir()
外部存储
外部存储分为公有目录和私有目录,其中私有目录也随应用卸载被删除
公有目录:Environment.getExternalStoragePublicDirectory(int type)
私有目录:/mnt/sdcard/Android/data/datad//cache
… /files
代码 FileActivity.java
package com.example.myapplication.datastorage;
import android.Manifest;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.example.myapplication.R;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
public class FileActivity extends AppCompatActivity {
private EditText mEtName;
private TextView mTvContent;
private Button mBtnSave,mBtnShow;
private SharedPreferences mSharedPreferneces;
private SharedPreferences.Editor mEditor;
private final String mFileName="test.txt";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
mEtName = findViewById(R.id.et_name);
mBtnSave = findViewById(R.id.btn_save);
mBtnShow = findViewById(R.id.btn_show);
mTvContent = findViewById(R.id.tv_content);
mBtnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
save(mEtName.getText().toString());
}
});
mBtnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mTvContent.setText(read());
}
});
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
//请求权限
}
private void save(String content){
FileOutputStream fileOutputStream=null;
//存储
try {
// fileOutputStream=openFileOutput(mFileName,MODE_PRIVATE);
//这里可以把MODE改成MODE_APPEND 就能不被覆盖
File dir =new File(getExternalFilesDir(null),"test_external");
//创建文件夹
if(!dir.exists()){
dir.mkdirs();
// boolean mkdir() : 创建此抽象路径名指定的目录。
// boolean mkdirs() : 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
}
File file=new File(dir,mFileName);
//创建文件
if(!file.exists()){
file.createNewFile();
}
fileOutputStream=new FileOutputStream(file);
fileOutputStream.write(content.getBytes());
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (fileOutputStream != null) {
//注意到close被标黄提示可能空指针异常,因为如果file Out Stream为空就会发生,所以先给一个判断
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private String read(){
FileInputStream fileInputStream=null;
//读
try {
// fileInputStream=openFileInput(mFileName);
File file=new File(getExternalFilesDir(null).getAbsolutePath()+File.separator+"test_external",mFileName);
//File.separator就是斜杠
fileInputStream=new FileInputStream(file);
byte[]buff=new byte[1024];
//每次读取1M的数据
StringBuilder sb=new StringBuilder("");
int len=0;
while((len=fileInputStream.read(buff))>0){
sb.append(new String(buff,0,len));
}
return sb.toString();
}catch (IOException e) {
e.printStackTrace();
}
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
内部存储
FileOutputStream
FileInputStream
代码 FileActivity.java
package com.example.myapplication.datastorage;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.myapplication.R;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileActivity extends AppCompatActivity {
private EditText mEtName;
private TextView mTvContent;
private Button mBtnSave,mBtnShow;
private SharedPreferences mSharedPreferneces;
private SharedPreferences.Editor mEditor;
private final String mFileName="test.txt";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
mEtName = findViewById(R.id.et_name);
mBtnSave = findViewById(R.id.btn_save);
mBtnShow = findViewById(R.id.btn_show);
mTvContent = findViewById(R.id.tv_content);
mBtnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
save(mEtName.getText().toString());
}
});
mBtnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mTvContent.setText(read());
}
});
}
private void save(String content){
FileOutputStream fileOutputStream=null;
//存储
try {
fileOutputStream=openFileOutput(mFileName,MODE_PRIVATE);
//这里可以把MODE改成MODE_APPEND 就能不被覆盖
fileOutputStream.write(content.getBytes());
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (fileOutputStream != null) {
//注意到close被标黄提示可能空指针异常,因为如果file Out Stream为空就会发生,所以先给一个判断
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private String read(){
FileInputStream fileInputStream=null;
//读
try {
fileInputStream=openFileInput(mFileName);
byte[]buff=new byte[1024];
//每次读取1M的数据
StringBuilder sb=new StringBuilder("");
int len=0;
while((len=fileInputStream.read(buff))>0){
sb.append(new String(buff,0,len));
}
return sb.toString();
}catch (IOException e) {
e.printStackTrace();
}
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}