第八天SharedPreferences存储+SD卡存储

SharedPreferences存储

1.SharedPreferences简介

SharedPreferences简称Sp(后面都会称Sp),是一种轻量级的数据存储方式,采用Key/value的方式 进行映射,最终会在手机的/data/data/package_name/shared_prefs/目录下以xml的格式存在。
Sp通常用于记录一些参数配置、行为标记等!因为其使用简单,所以大多数开发者用起来很爽!
但是 请注意:千万不要使用Sp去存储量大的数据,也千万不要去让你的Sp文件超级大,否则会大大影响应用性能, 甚至出现ANR(程序无响应)

2.SharedPreferences特点

1.保存少量的数据,且这些数据的格式非常简单。 存储5种原始数据类型: boolean, float, int, long, String
2.比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),记住密码功能,音乐播放器播放模式。

3.使用方式

**步骤1:**得到SharedPreferences对象 getSharedPreferences(“文件的名称”,“文件的类型”);
(1).Context.MODE_PRIVATE:指定该SharedPreferences数据只能被应用程序读写
(2)MODE_APPEND:检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
以下不在建议使用
(3).Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他
应用程序读,但不能写。
(4).Context,MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序写,但不能读。
**步骤2:**得到 SharedPreferences.Editor编辑对象
SharedPreferences.Editor editor=sp.edit();
**步骤3:**添加数据
editor.putBoolean(key,value)
editor.putString()
editor.putInt()
editor.putFloat()
editor.putLong()
**步骤4:**提交数据 editor.commit()或者apply()(推荐用这个.异步提交)
Editor其他方法: editor.clear() 清除数据 editor.remove(key) 移除指定key对应的数据

写数据

设置一个按钮提交

package com.example.myday0228work;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button sendId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendId = (Button) findViewById(R.id.send_id);
        sendId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取创建的.xml名字,第一个是xml的名字,第二个是模式
                SharedPreferences test = getSharedPreferences("test", MODE_PRIVATE);
                //获取编辑对象
                SharedPreferences.Editor edit = test.edit();
                //设置写入数据
                edit.putString("name","小明");
                edit.putInt("age",21);
                edit.putBoolean("ischeck",false);
                edit.putLong("id",10086);
                edit.putFloat("price",23.2f);
                //提交数据
                edit.commit();
            }
        });
    }
}

创建出来的是.xml

显示出来的是方式是以键值对的方式显示的xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="name">小明</string>
    <boolean name="ischeck" value="false" />
    <int name="age" value="21" />
    <float name="price" value="23.2" />
    <long name="id" value="10086" />
</map>

小案例

实现用户名、密码、记住密码提交保存功能

布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/username_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名" />

    <EditText
        android:id="@+id/password_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码" />

    <CheckBox
        android:id="@+id/check_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="记住密码" />

    <Button
        android:id="@+id/login_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登陆" />
</LinearLayout>

java代码

package com.example.myday0228;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
    private EditText usernameId;
    private EditText passwordId;
    private Button loginId;
    private CheckBox checkId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        usernameId = (EditText) findViewById(R.id.username_id);
        passwordId = (EditText) findViewById(R.id.password_id);
        loginId = (Button) findViewById(R.id.login_id);
        checkId = (CheckBox) findViewById(R.id.check_id);
        loginId = (Button) findViewById(R.id.login_id);

        //获取sp对象
        //第一个:xml名字,第二个:模式
        final SharedPreferences login = getSharedPreferences("login", MODE_PRIVATE);
        //上次选中的复选框是否被选中
        final boolean ischek = login.getBoolean("ischeked", false);
        String username = login.getString("username", "");
        String password = login.getString("password", "");


        //获取编辑对象
        final SharedPreferences.Editor edit = login.edit();
        if (ischek) {
            //读取到用户名和密码复选框显示在页面上
            usernameId.setText(username);
            passwordId.setText(password);
            checkId.setChecked(true);
        }
        //点击提交写入数据
        loginId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //判断记住密码是否被选中
                if (checkId.isChecked()) {
                    edit.putString("username", usernameId.getText().toString());
                    edit.putString("password", passwordId.getText().toString());
                    edit.putBoolean("ischeck", true);
                    edit.commit();
                } else {
                    edit.remove("username");
                    edit.remove("password");
                    edit.putBoolean("ischecked", false);
                    edit.commit();
                }
            }
        });
    }
}

文件存储

内部文件存储

openFileOutput

***存储路径只能是唯一的

FileOutputStream fileOutputStream = null;
                try {
                    fileOutputStream = openFileOutput("text.json", MODE_PRIVATE);
                    fileOutputStream.write("Holler Word".getBytes());
                    fileOutputStream.flush();
                    fileOutputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }

openFileInput

FileInputStream fileInputStream = null;
        try {
            fileInputStream= openFileInput("a.json");
            byte[] b = new byte[1024];
            int len = 0;
            while((len = fileInputStream.read(b)) != -1){
                Log.i(TAG, "onClick: "+new String(b,0,len));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

SD卡存储

SD卡介绍:
一般手机文件管理 根路径 /storage/emulated/0/或者/mnt/shell/emulated/0
第八天SharedPreferences存储+SD卡存储_第1张图片

重要代码:

(1)Environment.getExternalStorageState();// 判断SD卡是否
(2)Environment.getExternalStorageDirectory(); 获取SD卡的根目录
(3)Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 获取SD卡公开目录pictures文件夹

必须加读写SD卡的权限

<!--这个是非常重要的 必须要加-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

读写文件

布局文件

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

    <Button
        android:id="@+id/read_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读"/>
    <Button
        android:id="@+id/writ_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="写"/>

</LinearLayout>
```
# JAVA代码
```java
package com.example.mysd;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.app.Notification;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Button readId;
    private Button writId;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            String[] str = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
            requestPermissions(str, 100);
        }
        initView();
    }

    private void initView() {
        readId = (Button) findViewById(R.id.read_id);
        writId = (Button) findViewById(R.id.writ_id);
        writId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File dataDirectory = Environment.getDataDirectory();
                //创建输出流
                try {
                    FileOutputStream fileOutputStream = new FileOutputStream(new File(dataDirectory, "aaa.txt"));
                    fileOutputStream.write("2222".getBytes());
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        //读文件
        readId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建文件工厂对象
                File dataDirectory = Environment.getDataDirectory();
                //创建文件
                File file = new File(dataDirectory, "aaa.txt");
                try {
                    FileInputStream fileInputStream = new FileInputStream(file);
                    int len = 0;
                    byte[] bytes = new byte[1024];
                    while ((len = fileInputStream.read(bytes)) != -1) {
                        String s = new String(bytes, 0, len);
                        Toast.makeText(MainActivity.this, "" + s, Toast.LENGTH_SHORT).show();
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //请求码等于100 权限获取失败
        if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
            Toast.makeText(this, "不同意", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "同意", Toast.LENGTH_SHORT).show();
        }
    }
}

```

你可能感兴趣的:(android,java,app,安卓)