SharedPreference
以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中
使用方式
创建对象的方式有三种
Context 的 getSharedPreferences()
Activity 的 getPreferences()
PreferenceManager 的 getDefaultSharedpreferences()
获取数据
sharedPrefs.getXXX()方法,如getInt(),getString()等
储存数据 获取Editor对象 sharedPrefs.edit();
存入数据 editor.putXXX()方法,如putInt()、putString()
提交要保存的数据 editor.commit()
我们通过路径找文件 看一下运行结果 路径我在上面已经提到了 我使用的是Genymotion测试
访问手机内部存储需要root权限才可以访问
内部存储
将数据保存在内存空间中,数据用户不能轻易访问的区域,访问需要root权限。存储在/data/data/程序包名/files文件夹下
使用方式
其使用还是要通过FileInputStream和FileOutputStream对文件File进行操作,只不过不是通过他们的构造方法来创建。
获取FileInputStream
FileInputStream fis = openFileInput(); (Activity的方法)
FileOuputStream fos = openFileOutput(); (Activity的方法)
文件File将会自动创建
外部SDCard存储
在操作sd卡的时候需要在清单文件中添加权限
将数据保存到SDCard卡中,任何程序都可以访问,用户也很容易查看、修改。
使用方式
通过FileInputStream和FileOutputStream对文件File进行操作。
SDCard操作类Environment 进行SDCard状态获取
Environment.getExternalStorageState(); 获取扩展卡状态
Environment.MEDIA_MOUNTED 安装的并可读写
Environment.MEDIA_MOUNTED_READ_ONLY 安装的但只读
Environment.MEDIA_REMOVED 移除的
获取常用文件夹路径
Environment.getExternalStorageDirectory(); 获取扩展卡根文件夹
这个路径在sd卡下自己写 找不到 只能轻轻说声加油~
贴一个小demo
运行效果
在edittext 输入文本点击写入按钮 点击读取显示到textview 重要的事情说三遍 加权限~加权限~加权限~
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.example.lesson15_data_storage.MainActivity"> <CheckBox android:id="@+id/push" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="是否追加到原文件末尾"/> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示文本"/> <Button android:id="@+id/inner_storage" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存文本到内部存储中" android:onClick="onClick"/> <Button android:id="@+id/inner_read" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="读取内部存储的文本到TextView" android:onClick="onClick"/> <Button android:id="@+id/outter_read" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="读取扩展卡的文本到textview"/> <Button android:id="@+id/outter_write" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="将文本写入到扩展卡中"/> </LinearLayout>
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private CheckBox cbPush; private TextView textView; private EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cbPush= (CheckBox) findViewById(R.id.push); textView= (TextView) findViewById(R.id.text_view); edit= (EditText) findViewById(R.id.edit); getSharedPreferences(); } /** * 存储一个CheckBox的选中状态 */ private void getSharedPreferences() { //Context获取 参数1文件名 参数2文件权限 SharedPreferences preferences=getSharedPreferences("setting", Context.MODE_PRIVATE); //activity获取 文件名是当前活动名 SharedPreferences preferences1=getPreferences(MODE_PRIVATE); //获取editor对象 SharedPreferences.Editor editor1=preferences1.edit(); //保存数据 editor1.putString("text","通过activity对象获取"); //提交数据 editor1.commit(); //PreferenceManager获取 文件名自动生成 访问权限默认私有 PreferenceManager.getDefaultSharedPreferences(MainActivity.this) .edit() .putString("text","通过PreferenceManager获取") .commit(); //参数1 key 参数2 默认值 基本数据类型要求不可以为空 所以必须有默认值 boolean checked=preferences.getBoolean("cbPush",false); cbPush.setChecked(checked); cbPush.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //通过context获取 参数1 存储的文件名 参数2 数据的访问权限 SharedPreferences sharedPreferences=getSharedPreferences("setting", Context.MODE_PRIVATE); //获取编辑器对象 SharedPreferences.Editor edit=sharedPreferences.edit(); //存入数据 edit.putBoolean("cbPush",isChecked); //提交修改 edit.commit(); } }); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.inner_storage: write();//写入到内部文件 Toast.makeText(MainActivity.this,"写入成功",Toast.LENGTH_SHORT).show(); break; case R.id.inner_read: read();//读取内部文件 Toast.makeText(MainActivity.this,"读取成功",Toast.LENGTH_SHORT).show(); break; case R.id.outter_read: oread();//读取sdcard文件 Toast.makeText(MainActivity.this,"读取成功",Toast.LENGTH_SHORT).show(); break; case R.id.outter_write: owrite();//写入sdcard文件 Toast.makeText(MainActivity.this,"写入成功",Toast.LENGTH_SHORT).show(); break; } } private void oread() { String state=Environment.getExternalStorageState(); try { //判断是否读写 或只读 if(state.equals(Environment.MEDIA_MOUNTED)||state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)){ File sdcardRoot=Environment.getExternalStorageDirectory(); File read=new File(sdcardRoot,"my/text.txt"); if(read.exists()){ FileInputStream fis=new FileInputStream(read); //字节转字符会进行字节编码的转换 new InputStreamReader(fis,"utf-8") android默认utf-8 BufferedReader reader=new BufferedReader(new InputStreamReader(fis)); String str=reader.readLine(); textView.setText(str); reader.close(); fis.close(); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void owrite() { try { //获取扩展卡状态 String state= Environment.getExternalStorageState(); //是否可读写 if(state.equals(Environment.MEDIA_MOUNTED)){ //获取扩展卡文件夹目录 File sdcardRoot=Environment.getExternalStorageDirectory(); File save=new File(sdcardRoot,"my/text.txt"); //判断文件是否存在 if (save.exists()){ }else{ //判断父级文件夹是否存在 if(!save.getParentFile().exists()){ //创建文件夹 save.getParentFile().mkdirs(); } //创建文件 save.createNewFile(); } String text=edit.getText().toString(); //文件是否在原文件末尾追加 cbPush.isChecked() checkbox 是否选中 FileOutputStream fos=new FileOutputStream(save,cbPush.isChecked()); fos.write(text.getBytes("utf-8")); fos.flush(); fos.close(); // //是否是文件夹 // save.isDirectory(); // //是否是文件 // save.isFile(); // //是否是隐藏文件 文件名以 .开头的文件 // save.isHidden(); // //获取所有子文件的文件名数组 // save.list(); // //获取所有子文件的文件数组 // save.listFiles(); } } catch (IOException e) { e.printStackTrace(); } } private void read() { try { //读取写入的文件 FileInputStream fis=openFileInput("text.txt"); int len=-1; byte [] b=new byte[1024]; ByteArrayOutputStream bos=new ByteArrayOutputStream(); while ((len=fis.read(b))!=-1){ bos.write(b,0,len); } textView.setText(bos.toString("utf-8")); bos.close(); fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void write() { try { //获取输入框内容 String text=edit.getText().toString(); //判断是否为空 if(TextUtils.isEmpty(text))return; //写入方式 追加或覆盖 int mode=cbPush.isChecked()?MODE_APPEND:MODE_PRIVATE; //获取FileOutputStream FileOutputStream fos=openFileOutput("text.txt",mode); //字符串转换为byte 写入文件 fos.write(text.getBytes("utf-8")); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }