1.内部存储
- 地址:date/date/项目包名(和当前项目有关)
- 特点:随着APP的卸载而消失
- 应用:存一些用户的状态,少量的数据,以键值对来存取
SharedPreferences的四种操作权限
内部存储的存取操作
//写入内部存储
public void writeDatas(){
//获取SharedPreferences往内存里写数据 存储的文件名 操作权限
SharedPreferences sharedPreferences = getSharedPreferences("123",MODE_PRIVATE);
//获取写入数据的方法
SharedPreferences.Editor editor = sharedPreferences.edit();
//写入单条数据 可以存入多种类型String,Int,Boolean,Float,Long,StringSet
editor.putString("name","张三2");
editor.putInt("age",19);
//一次存入多条数据
Set<String> names = new HashSet<>();
names.add("1");
names.add("2");
names.add("3");
editor.putStringSet("keySet",names);
//最后要提交一下事务,不然数据不会存入到文件里
editor.commit();
}
//读取内部存储
public void readDates(){
//获取SharedPreferences往内存里写数据 存储的文件名 操作权限
SharedPreferences sharedPreferences = getSharedPreferences("123", MODE_PRIVATE);
//通过键名获取内容: 第一个参数是键名,第二个参数是默认值
String string = sharedPreferences.getString("name", null);
Set<String> keySet = sharedPreferences.getStringSet("keySet", null);
//如果获取Set集合使用foreach
for (String s:keySet
) {
Log.i("---",s);
}
Log.i("---",string);
}
2.外部存储
- 地址:storage/emulated/0
- 特点:APP被卸载数据不会消失
- 应用:存取文件,操作SD卡,如果SD卡状态不对则不能读写数据
执行外部存储操作前要先添加静态权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果添加了静态权限还不能执行外部存储的操作,则可能是SDK
卡的版本不对就得添加动态权限,这里建议直接添加上动态权限
//判断SDK卡的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
String[] strings = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
this.requestPermissions(strings,100);
}
外部存储的存取操作
//存到外部存储
public void saveFie(){
//判断SD卡状态
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
try {
//获取外部存储的根目录
String sdpath = Environment.getExternalStorageDirectory().getPath();
//使用文件输入流将数据存入外部存储
FileOutputStream fileOutputStream = new FileOutputStream(sdpath+"/a.txt");
fileOutputStream.write("123123".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//读外部存储
public void readFile(){
//判断SD卡状态
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//这边直接明确要读取的文件的位置
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/a.txt");
try {
//使用文件输出流
FileInputStream fis = new FileInputStream(file);
int len = 0;
byte[] bys = new byte[1024];
StringBuffer stringBuffer = new StringBuffer();
while((len = fis.read(bys)) != -1){
//将内容拼接起来
stringBuffer.append(new String(bys,0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//下载文件到外部存储
public void downloadimg(){
try {
URL url = new URL("http://attach.bbs.miui.com/forum/201204/17/1539083wxpexg5b0fbvzpv.jpg");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
if (connection.getResponseCode()==200){
InputStream is = connection.getInputStream();
FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/img.jpg");
int len = 0;
byte[] bys = new byte[1024];
//在要获取网络数据的时候判断SD卡的状态
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
while((len = is.read(bys)) != -1){
fos.write(bys,0,len);
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}