一.SharedPreferences的使用以及注意事项
SharedPreferences的四种操作模式
以键值对的方式来进行存储
创建出一个主页面,及其layout视图来测试。
我们先来实现第一种Sharedpreferen
写出我们的Java文件名为SharedPreference
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class ShareActivity extends AppCompatActivity {
private EditText accEdt,pwdEdt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_share);
accEdt = findViewById(R.id.acc_edt);
pwdEdt = findViewById(R.id.pwd_edt);
//SharePreference的读取
//①获取SharePreference对象(参数1:文件名 参数2:模式)
SharedPreferences share = getSharedPreferences("myshare",MODE_PRIVATE);
//②根据key获取内容(参数1:key 参数2:当对应key不存在时,返回参数2的内容作为默认值)
String accStr = share.getString("account","");
String pwdStr = share.getString("pwd","");
accEdt.setText(accStr);
pwdEdt.setText(pwdStr);
findViewById(R.id.login_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//1.获取两个输入框的内容
String account = accEdt.getText().toString();
String pwd = pwdEdt.getText().toString();
//2.验证(admin 123)
if(account.equals("admin") && pwd.equals("123")){
//2.1存储信息到SharePreference
//①获取SharePreference对象(参数1:文件名 参数2:模式)
SharedPreferences share = getSharedPreferences("myshare",MODE_PRIVATE);
//②获取Editor对象
SharedPreferences.Editor edt = share.edit();
//③存储信息
edt.putString("account",account);
edt.putString("pwd",pwd);
//④指定提交操作
edt.commit();
Toast.makeText(ShareActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
}else {
//2.2验证失败,提示用户
Toast.makeText(ShareActivity.this,"账号或密码错误",Toast.LENGTH_SHORT).show();
}
}
});
}
}
如果账号和密码能够对应,就会在data的文件夹下创建出来一个你想要命名的文件夹,然后我们就可以在代码中读取这个文件夹,再次点开界面时就会直接显示出账号和密码。
主要的布局文件的控件代码为:
<EditText
android:id="@+id/acc_edt"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/guideline5"/>
<EditText
android:id="@+id/pwd_edt"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:inputType="textPassword"
app:layout_constraintBottom_toTopOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="@+id/guideline5" />
文件夹的查看路径为
二:外部储存(重点)
首先要在ManiFest文件中进行声明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
创建出一个java文件名称为ExternalActiviy
代码的内容为
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
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 ExternalActivity extends AppCompatActivity {
EditText infoEdt;
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_external);
infoEdt = findViewById(R.id.info_edt);
txt = findViewById(R.id.textView);
int permisson = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permisson!=PackageManager.PERMISSION_GRANTED){
//动态去申请权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
}
//上面的第三个参数的意思为,当我们调用上面的方法时间,会自动的去有下方的方法的使用,我们可以在下面的方法中补充我们还需要的功能,如果requestCode和上面第三个参数相同的话,我们就可以去调用了。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1){
//xxxxxxxxxxxxx
}
}
public void operate(View v){
//Environment.getExternalStorageDirectory()是获取的是根目录。
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/imooc.txt";
Log.e("TAG",path);
//if(Environment.getExternalStorageState().equals("mounted"))
switch (v.getId()){
case R.id.save_btn:
File f = new File(path);
try {
if (!f.exists()) {
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(path,true);
String str = infoEdt.getText().toString();
fos.write(str.getBytes());
}catch (IOException ioe){
ioe.printStackTrace();
}
break;
case R.id.read_btn:
try {
FileInputStream fis = new FileInputStream(path);
byte[] b = new byte[1024];
int len = fis.read(b);
String str2 = new String(b,0,len);
txt.setText(str2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
代码的主要意思为先是来读取文件,获取文件的路径,创建出对应的文件夹,用IO流来对文件进行写入,再在另一个控件的下方来读取我们所保存的文件。
我们要设置动态的权限,来使我们在不同的手机上都能够使用。
ContextCompat.checkSelfPermission(context,pression)
//代码的意思为检查当前设备是否具有权限。会返回一个int值来看是否具有权限
ActivityCompat.requestPermissions (activity,pression,code)
//代码的意思为获取权限
PackageManager.PERMISSION_GRANTED
//意思是权限被允许
创建出我们的布局文件
<EditText
android:id="@+id/info_edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="22dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:maxLines="12"
android:minLines="12"
android:gravity="left|top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/read_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/save_btn"
app:layout_constraintTop_toTopOf="parent"
android:onClick="operate" />
<Button
android:id="@+id/save_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:onClick="operate" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="176dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
视图的效果为
点击保存和读取的功能按钮就实现了相关的功能
获取外部存储的目录
获取外部存储的私有目录
长期储存的数据放在上面这个文件夹当中
不需要长期存储的数据放在上面的文件中
我们一般情况下都将需要的东西放在这个目录下方,不放在根目录下,因为放在根目录下的内容不会因为我们的卸载而删除。
三.内部存储
上面的文件夹下放入普通的文件
上方的文件夹下放入缓存的文件
内部操作不需要权限
代码为
import android.Manifest;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class InternalActivity extends AppCompatActivity {
EditText edt;
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_internal);
edt = findViewById(R.id.editText);
txt = findViewById(R.id.textView);
}
public void operate(View v){
File f = new File(getFilesDir(),"getFilesDirs.txt");
switch (v.getId()){
case R.id.save_btn:
try {
if (!f.exists()) {
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(f);
fos.write(edt.getText().toString().getBytes());
fos.close();
}catch (IOException e){
e.printStackTrace();
}
break;
case R.id.read_btn:
try {
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[1024];
int len = fis.read(b);
String str2 = new String(b,0,len);
txt.setText(str2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
数据的处理与外部存储相一致
内部存储与外部存储的区别参考下面的博客:
https://blog.csdn.net/baidu_36385172/article/details/79695308?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160188912519725222413159%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160188912519725222413159&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v2-1-79695308.first_rank_ecpm_v3_pc_rank_v2&utm_term=内部存储和外部存储的区别是什么&spm=1018.2118.3001.4187
如此便完成了安卓本地存储的学习