关闭

SharedPreferences和File<一>

标签: SharedPreferencesFile数据存储
240人阅读 评论(0) 收藏 举报
分类:

一,SharedPreferences:

(1)简称:SP存储

(2)位置:用它时,将会默认在data/data/包名/下创建一个名字为:shared_prefs的文件夹,

   然后再在shared_prefs目录下创建你命名的文件.

(3)创建步骤:

<1>获取上下文的SharedPreferences对象

<2>调用刚刚获取的SharedPreferences对象的editor()方法,返回一个Editor对象

        <3>用editor对象的putXXX(参数1 ,参数2):方法来存储数据,是类似一个map集合存储

  <4>调用editor对象的commit()方法提交数据

现在一般用apply()提交,以前用commit()

(4)创建举例:

 //1,获取上下文对象的SharedPreferences对象  ,第一个参数:文件名,第二个:权限类型
        SharedPreferences  sp  =  context.getSharedPreferences("configure" , Context.MODE_PRIVATE);
        //2,获取Editor对象
        Editor editor = sp.edit();
        //3.存放数据
        editor.putString("username" , username);
        editor.putString("password" , password);
        editor.putFloat("float" , 12);
        //4.用editor.commit()方法提交
        editor.commit();

第4步,改为:

editor.apply(); //以前都是用commit

(5)取出数据:

<1>获取刚刚创建的SharedPreferences对象,并传入文件名和mode类型

<2> 调用SharedPreferences对象的getXXX方法,取出键值对,

如:

/调用方法保存
                       SaveLogin.saveLoginMessage(LoginActivity.this , strName , strWord );
                       //1.获取SharedPreferences对象
                       SharedPreferences sp =  getSharedPreferences("configure" , Context.MODE_PRIVATE);
                       String sName = sp.getString("username" , "");
                       String sWord = sp.getString("password" , "");
                       Float  flt   = sp.getFloat("float" , 0);
                       Toast.makeText(LoginActivity.this , "名字是:" + sName + "\n密码: " +
                               sWord + "\n 值:" + flt, Toast.LENGTH_SHORT).show();


2,commit()与apply()比较:为什么现在常用apply提交?

看一下源码注释,大概意思:

    /**commit与apply()的区别
     * 1. apply没有返回值而commit返回boolean表明修改是否提交成功
     2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘,
     而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,
     他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。
     而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,
     这样从一定程度上提高了很多效率。
     3. apply方法不会提示任何失败的提示。
     由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,
     如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,
     还是需要用commit的*/

3,利用sp最常见的例子无疑就是记住用户名和密码,例子在最下面....


二,File存储:(java文件存取大家都很熟悉,就,,,)

1,简意:利用文件来存储

2,向文件写入:

相关:FileOutputStream---文件输出流

                   BufferedWriter


3,从文件中读取数据:

相关:FileInputStream

   BufferedReader


很简单的例子:

    /**
     * FiLe存储监听
     * @param view
     */
    @OnClick(R.id.file_save)
    public void save(View view){

        //获取输入
        String str = mEdtInput.getText().toString().trim();

        //判空:null或者空字符串
        if(!TextUtils.isEmpty(str)){
            //文件输出流与BufferedWriter
            FileOutputStream out = null;
            BufferedWriter writer = null;

            //写入
            try{
                out =   openFileOutput("data" , Context.MODE_PRIVATE);
                writer = new BufferedWriter(new OutputStreamWriter(out));
                writer.write(str);

            }catch (IOException e){
                e.printStackTrace();
            }finally {
                if(writer != null){
                    try {
                        //关闭流
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            Toast.makeText(MainActivity.this , "save Success" , Toast.LENGTH_SHORT).show();

        }else {
            Toast.makeText(MainActivity.this , "save failure" , Toast.LENGTH_SHORT).show();
        }
    }


    /**
     * 文件读取
     * @param view
     */
    @OnClick(R.id.read)
    public void read(View view){
        //文件输入流与BufferedReader对象
        FileInputStream in = null;
        BufferedReader reader = null;
        //用于追加结果
        StringBuffer content = new StringBuffer();

        //读取
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null){
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭流
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //结果:判空并显示
        String result = content.toString();
        if(!TextUtils.isEmpty(result)){
            mEdtInput.setText(result);
            mEdtInput.setSelection(result.length());
            Toast.makeText(MainActivity.this , "read Success" , Toast.LENGTH_SHORT).show();
        }else {
            mEdtInput.setText("");
            Toast.makeText(MainActivity.this , "read failure" , Toast.LENGTH_SHORT).show();
        }
    }

4:常用方法

        //判断是否插入sd卡
        Environment.getExternalStorageState();
        //获取外部存储器路径,也就是SD卡目录
        Environment.getExternalStorageDirectory();
        //(3)常用读写sd卡文件方法
        FileInputStream,FileOutputStream, FileReader, FileWriter


        //在应用程序下获取或创建name对应的子目录
        public File getDir(String name, int mode)
        
        //获取该应用程序的数据文件的绝对路径
        File getFilesDir();


三,一个记住用户名和密码例子:

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="Account:" />

        <EditText
            android:id="@+id/account"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"/>
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="Password:" />

        <EditText
            android:id="@+id/password"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            android:inputType="textPassword" />
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <CheckBox
            android:id="@+id/remember_pass"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="Remember password" />

    </LinearLayout>

    <Button
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="Login" />

</LinearLayout>

Activity:

public class LoginActivity extends AppCompatActivity {

    //用户名
    @ViewInject(R.id.account)
    private EditText accountEdit;

    //密码
    @ViewInject(R.id.password)
    private EditText passwordEdit;

    //登录
    @ViewInject(R.id.login)
    private Button login;

    //记住密码checkBox
    @ViewInject(R.id.remember_pass)
    private CheckBox rememberPass;

    //pref,pref.editor对象
    private SharedPreferences pref;
    private  SharedPreferences.Editor editor ;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        //初始化inject
        ViewUtils.inject(this);

        //获取pref
        pref = PreferenceManager.getDefaultSharedPreferences(this);
        //判断是否选中记住密码
        boolean isRemember = pref.getBoolean("remember_password" , false);
        if(isRemember){
            String account = pref.getString("account" , "");
            String password = pref.getString("password" , "");
            accountEdit.setText(account);
            passwordEdit.setText(password);
            rememberPass.setChecked(true);  //设置选中
        }

    }


    /**
     * 登录
     * @param view
     */
    @OnClick(R.id.login)
    public void toLogin(View view){

        //获取用户名和密码
        String account = accountEdit.getText().toString().trim();
        String password = passwordEdit.getText().toString().trim();

        //判断用户名和密码是否正确
        if(account.equals("maiyu") && password.equals("123456")){
            //获取pref.edit()
            editor = pref.edit();
            //判断是否选中记住密码,是的话存储pref
            if(rememberPass.isChecked()){
                editor.putBoolean("remember_password" , true);
                editor.putString("account" , account);
                editor.putString("password" , password);
            }else {
                editor.clear();     //不存储
            }
            editor.apply();
            //跳转
            Intent intent = new Intent(LoginActivity.this , TestActivity.class);
            startActivity(intent);
            finish();
        }else {
            //密码或用户名错误
            Toast.makeText(LoginActivity.this , "account or password is unvalid",Toast.LENGTH_SHORT).show();
        }
    }

}


0
0
查看评论

SharedPreferences和SQLite

在Android存在中有两个和很重要的存储方式,一个是XML一个是数据库。 下面我就来介绍一下这样两个工具,SharedPreferences和SQLite 用着两个存储,我建议大家用工具类的方法进行操作。这样能让代码更加简洁和更好操作 下面我写一个小例子: 用SharedPrefe...
  • weixin_36545772
  • weixin_36545772
  • 2017-07-03 11:40
  • 217

Android源码分析之SharedPreferences

在Android的日常开发中,相信大家都用过SharedPreferences来保存用户的某些settings值。Shared Preferences 以键值对的形式存储私有的原生类型数据,这里的私有的是指只对你自己的app可见的,也就是说别的app是无法访问到的。 客户端代码为了使用它...
  • ljz2009y
  • ljz2009y
  • 2014-07-02 17:35
  • 4427

sharePreference无法创建

<br /><br />01-26 17:40:10.932: ERROR/ApplicationContext(13604): Couldn't rename file /data/data/acg.iptv.account/shared_prefs/USER_IN...
  • hncjlxf
  • hncjlxf
  • 2011-01-26 18:15
  • 3997

Android - SharedPreferences共享数据的相同Context

SharedPreferences共享数据的相同Context本文地址: http://blog.csdn.net/caroline_wendy使用SharedPreferences,可以存储和共享数据,需要使用相同的Context和TAG。在设置(put)数据的部分,提供public的T...
  • u012515223
  • u012515223
  • 2015-02-07 22:57
  • 2181

SharedPreferences与Properties对比

1、SharedPreferences,五大存储方式中最简单的一种,属于键值对形式的,JAVA的util包中中还有个Properties,也是键值对形式的,同样用于存储。现在把  SharedPreferences与Properties做一个简单对比!!! 1.1、从类的高度来看 ...
  • u013263323
  • u013263323
  • 2015-08-31 15:40
  • 1172

android中SharedPreferences配置文件的创建与删除

1.保存文件     SharedPreferences sp
  • fengleige131
  • fengleige131
  • 2014-04-22 11:32
  • 3848

Android数据存储之sharedpreferences与Content Provider

android中对数据操作包含有:file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据其中sqlite3已经在上一节中讲述了,本节主要包含share...
  • whuhan2013
  • whuhan2013
  • 2016-03-20 16:14
  • 1219

android studio File Explorer中查看不到SharedPreferences保存的文件

这几天把android 的内部存储学了一遍,发现一个问题,当我打开android studio的File Explorer查看SharedPreferences保存的xml文件时,发现data/data/包名/shared_prefs文件夹下是空的,还有通过SqLiteDataBase和SQLite...
  • lb1207087645
  • lb1207087645
  • 2016-10-22 17:42
  • 3155

Android开发:SharedPreferences 存储数据、获取数据

Android开发:SharedPreferences 存储数据、获取数据
  • chentravelling
  • chentravelling
  • 2016-04-10 20:12
  • 2849

SharedPreferences存储多种类型

SharedPreferences轻量级存储 public class SharedManager { String SHARE_NAME = "CUNCU";//文件名称 public static void saveUid(String uid) {  ...
  • DreamIsToHave
  • DreamIsToHave
  • 2016-07-22 11:06
  • 1880
    个人资料
    • 访问:83002次
    • 积分:1305
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:3篇
    • 译文:0篇
    • 评论:12条
    最新评论