• Android简单介绍SharedPreference,内部文件,sdcard数据存储


    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();
            }
        }
    }
  • 相关阅读:
    桥接,NAT,Host Only的区别
    PHP并发IO编程之路
    Git SSH Key 生成步骤
    composer安装学习
    db file sequential read等待事件的一点研究
    多个hints 怎么写?
    再次遭遇笛卡尔积
    pl/sql 在一个程序块里打印日志输出到表格
    pl/sql 程序块里打印问题
    利用ordered hints优化SQL
  • 原文地址:https://www.cnblogs.com/r-decade/p/5860595.html
Copyright © 2020-2023  润新知