SharedPreferences简称Sp(后面都会称Sp),是一种轻量级的数据存储方式,采用Key/value的方式 进行映射,最终会在手机的/data/data/package_name/shared_prefs/目录下以xml的格式存在。
Sp通常用于记录一些参数配置、行为标记等!因为其使用简单,所以大多数开发者用起来很爽!
但是 请注意:千万不要使用Sp去存储量大的数据,也千万不要去让你的Sp文件超级大,否则会大大影响应用性能, 甚至出现ANR(程序无响应)
1.保存少量的数据,且这些数据的格式非常简单。 存储5种原始数据类型: boolean, float, int, long, String
2.比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),记住密码功能,音乐播放器播放模式。
**步骤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 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>
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();
}
}
});
}
}
***存储路径只能是唯一的
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = openFileOutput("text.json", MODE_PRIVATE);
fileOutputStream.write("Holler Word".getBytes());
fileOutputStream.flush();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
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卡介绍:
一般手机文件管理 根路径 /storage/emulated/0/或者/mnt/shell/emulated/0
(1)Environment.getExternalStorageState();// 判断SD卡是否
(2)Environment.getExternalStorageDirectory(); 获取SD卡的根目录
(3)Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 获取SD卡公开目录pictures文件夹
<!--这个是非常重要的 必须要加-->
<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();
}
}
}
```