SD卡存储
SharedPreferences
须知
1、保存方式非常简单,以键值对的方式存储。 存储5种原始数据类型: boolean, float, int, long, String。
2、存储位置:data/data应用程序包名/shared_prefs/xxx.xml。
3、存储各种配置信息,游戏界面设置、音效设置、记住密码等。
//已创建,不能直接创建数据,只能读 - 第二个参数指,只能被本应用使用
SharedPreferences sp = getSharedPreferences("day8", Context.MODE_PRIVATE);
//秘书存数据-删数据
SharedPreferences.Editor edit = sp.edit();
edit.putString("name","Asuna");//存数据
edit.commit();//执行
//删除
// edit.remove("name");//根据键删除
// edit.clear();//清空
// edit.commit();
//读数据
username.setText(sp.getString("name","Amlv"));
SD卡存储
方法:
1、Environment.getExternalStorageState();// 返回主外部存储目录
2、Environment.getExternalStorageDirectory(); 获取SD卡的根目录
3、Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 获取SD卡公开目录pictures文件夹
注意事项:
存储SD卡位置:mnt/shell/emulated/0/文件名
必须在清单文件中写读写权限
//读
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
//写
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
java代码:
public void click(View view) {
Access(Manifest.permission.READ_EXTERNAL_STORAGE,1);//读 - 第二个参数自定义
Access(Manifest.permission.WRITE_EXTERNAL_STORAGE,2);//写
}
private void checkAccess(String access,int code) {
//6.0以后获得网络授权
//检查当前权限,若没有该权限,值为-1,若没有该权限,值为0
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
//判断是否获得权限 第二个参数
int i = ContextCompat.checkSelfPermission(getApplication(), access);
if (i == PackageManager.PERMISSION_DENIED) {
//获得授权
}else{
//没有获得授权,会弹出一个对话框(对话框是系统的,开发者不能自己定制),用户选择是否授权应用使用系统权限
//第一个参数:上下文
//第二个参数:需要授权的字符串数组
//第三个参数:请求码requestCode,在回调方法中会用到 自定义
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},code);
}
}else{
//6.0以前直接使用
readJson();
}
}
//不管用户是否选择授权,都会回调这个方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//第一个参数:请求码,对应上述方法的第三个参数
//第二个参数:请求权限数组
//第三个参数:请求权限的结果数组
if (requestCode==1) {
if (permissions[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE )&& grantResults[0] == PackageManager.PERMISSION_DENIED) {
//授权成功
writeJson();
}else{
//未获得授权
finish();
}
}
}
//写数据
private void writeJson() {
Log.e("##########","开始写");
new Thread(new Runnable() {
@Override
public void run() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//获取SD卡根路径
File file = Environment.getExternalStorageDirectory();
FileOutputStream fos=null;
String str="正确存储";
Log.e("##########","文件路径"+file.getPath());
try {
fos=new FileOutputStream(new File(file,"day8.txt"));
fos.write(str.getBytes());
Log.e("##########","写入");
} catch (FileNotFoundException e) {
e.printStackTrace();
str="文件未找到";
} catch (IOException e) {
e.printStackTrace();
str="传输错误";
}finally {
try {
fos.close();
Message message = new Message();
message.what=1;
message.obj="传输结束:"+str;
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
//读数据
private void readJson() {
new Thread(new Runnable() {
@Override
public void run() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = Environment.getExternalStorageDirectory();
FileInputStream fis=null;
StringBuffer sb = new StringBuffer();
try {
fis=new FileInputStream(new File(file,"day8.txt"));
byte[] bys=new byte[1024];
int len=0;
while((len=fis.read(bys))!=-1){
sb.append(new String(bys,0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fis!=null) {
try {
fis.close();
Message message = new Message();
message.what=2;
message.obj=sb.toString();
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}).start();
}