第五周的内容不是很多,主要是学习持久化存储,从SharedPreferences ,到随心所欲的管理文件夹。
一、SharedPreferences
是一个轻量级的存储类,用来保存一些应用的常用配置。它可以用来进行数据间的共享,包括程序之间,或同一程序的不同组件。在Android系统中它以XML的形式保存, /data/data/PACKAGE_NAME/shared_prefs目录下。
创建,需要sharedPreferences对象,它的内部类Editor对象来执行相关操作
SharedPreferences sharedPreferences=getSharedPreferences("preference_name", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPreferences.edit();
1.增,用键值对的方式存储
editor.putInt("list_view_count",count);
2.删,提供键就可以删除相对应的数据
editor.remove("list_view_count");
3.改,提供相同的键,不同的值,后值覆盖前值。
editor.putInt("list_view_count",count+1);
4.查,通过键得到数据,设默认值。
count=sharedPreferences.getInt("list_view_count",3);
5.提交,两种方式
editor.commit();
editor.apply();
两种提交方式选择一种即可,commit马上提交,apply在背后线程提交。推荐第二种方式。
获取SharedPreferences的两种方式:
1 调用Context对象的getSharedPreferences()方法
2 调用Activity对象的getPreferences()方法
两种方式的区别:
调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.
SharedPreferences的四种操作模式:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
SharedPreferences,是一种持久化的方式,操作方式也比较简单。值得推荐。
二、如何管理好文件
Internal storage 内部存储 ,External storage 外部存储。应用本身就可以进行内部存储写入与读取的能力
写入 外部存储的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
读取外部存储的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
getFilesDir(),返回一个File,代表了我们的app的internal目录
getCacheDir(),返回一个File,代表我们的app的internal的缓存目录
新建一个文件
// 创建一个文件 test.txt
File file=new File(getFilesDir(),"test.txt");
Log.i("xyy","路径:"+getFilesDir().getAbsolutePath());
Log.i("xyy","路径file:"+file.getAbsolutePath());
try {
boolean isSuccess=file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
打印的日志:
路径:/data/data/com.exa.sharedpreferencedemo/files
路径file:/data/data/com.exa.sharedpreferencedemo/files/test.txt
另一种创建文件方式,往文件里写入数据
String string="Our teacher is handsome";
try {
/*得到输出流*/
FileOutputStream fileOutputStream=openFileOutput("test2.txt",Context.MODE_PRIVATE);
try {
fileOutputStream.write(string.getBytes());
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
检查外部存储
// 检查 External是否可用
String state= Environment.getExternalStorageState();
if(TextUtils.equals(state,Environment.MEDIA_MOUNTED));
文件是默认存储在/data/data//files/目录下
读取文件数据
public String load(){
FileInputStream in=null;
BufferedReader reader=null;
StringBuilder content=new StringBuilder();
try {
/*得到输入流*/
in=openFileInput("test2.txt");
reader=new BufferedReader(new InputStreamReader(in));
String line="";
while ((line=reader.readLine())!=null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
读取各目录下的文件
读取assets文件内的东西
// 读取assets文件内的东西
void testAssets(){
// 第一种,直接读路径
WebView webView=new WebView(this);
webView.loadUrl("file///android_asset/.test.html");
// 读取html,assets文件内的
try {
//得到输入流,可以进行读取操作。
InputStream inputStream= getResources().getAssets().open("test.html");
} catch (IOException e) {
e.printStackTrace();
}
//
try {
// 读列表
String[] fileNames=getAssets().list("images/");
// 读取图片,得到输入流
InputStream inputStream=getAssets().open("images/dog.jpg");
// 将输入流转为 位图
Bitmap bitmap= BitmapFactory.decodeStream(inputStream);
ImageView imageView=new ImageView(this);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
// 读音乐
try {
AssetFileDescriptor assetFileDescriptor=getAssets().openFd("xiaohongchen.mp3");
MediaPlayer mediaPlayer=new MediaPlayer();
mediaPlayer.reset();
mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),
assetFileDescriptor.getStartOffset(),
assetFileDescriptor.getLength());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
读取raw文件内东西,raw里面不能有目录结构。 raw会给资源文件在R文件一个索引
void testResFile(){
// 得到输入流,可以进行读取操作。
InputStream inputStream=getResources().openRawResource(R.raw.xiaohongchen);
}
assets与raw文件内的东西,都不会编译。
读取SD卡
void testSDCard(){
File file=new File("");
String tempPath=Environment.getExternalStorageDirectory().getAbsolutePath();
// 获取android中的data目录
Environment.getDataDirectory();
// 获取下载的缓存目录
Environment.getDownloadCacheDirectory();
}