SharedPreferences存储

特点

  • sp存储专门用来存储一些单一的小数据key--value
  • 存储数据的类型:boolean,float,int,long,String
  • SharedPreferences存储的位置:/data/data/packageName/shared_prefs/xxx.xml
  • 可以设置数据智能是当前应用读取,而别的应用不可以
  • 应用卸载时会删除此数据

API

SharedPreferences:对应sp文件的接口

context.getSharedPreferences(Stringnameintmode): 得到SP对象

  • name:文件名(不带xml)
  • mode:生成的文件模式(是否是私有的,即其它应用是否可以访问) 

Editor sp.edit(): 得到Editor对象

-Xxx sp.getXxx(namedefaultValue): 根据name得到对应的数据



Editor:能更新sp文件的接口
- Editor put(namevalue):保存一个键值对,没有真正保存到文件中 - Editor remove(name)
-commit():提交,数据真正保存到文件中了

保存读取数据操作

package com.example.sharedpreferences;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class SpActivity extends Activity {

    private EditText et_sp_key;
    private EditText et_sp_value;

    private SharedPreferences sp;

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

        et_sp_key = (EditText) findViewById(R.id.et_sp_key);
        et_sp_value = (EditText) findViewById(R.id.et_sp_value);

        //1. 得到sp对象,Context.MODE_PRIVATE表示文件模式,是否是私有的,即其他应用是否可以访问
        sp = getSharedPreferences("SharedPreferences", Context.MODE_PRIVATE);
    }

    public void save(View v) {
        //2. 得到editor对象
        SharedPreferences.Editor edit = sp.edit();
        //3. 得到输入的key/value
        String key = et_sp_key.getText().toString();
        String value = et_sp_value.getText().toString();
        //4. 使用editor保存key-value
        edit.putString(key, value).commit();
        //5. 提示
        Toast.makeText(this, "保存完成!", Toast.LENGTH_LONG).show();
    }

    public void read(View v) {
        //1. 得到输入的key
        String key = et_sp_key.getText().toString();
        //2. 根据key读取对应的value
        String value = sp.getString(key, null);
        //3. 显示
        if(value==null) {
            Toast.makeText(this, "没有找到对应的value", Toast.LENGTH_LONG).show();
        } else {
            et_sp_value.setText(value);
        }
    }
}

手机内部文件存储

手机内部文件存储说明

  • 应用运行需要的一些较大的数据或者图片可以用文件保存的手机内部
  • 存储数据的类型:任意
  • SharedPreferences存储的位置:/data/data/packageName/files/文件
  • 可以设置数据智能是当前应用读取,而别的应用不可以
  • 应用卸载时会删除此数据

相关API

保存读取数据操作

package com.example.sharedpreferences;

import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class IFActivity extends Activity {

    private ImageView iv_if;

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

        iv_if = (ImageView) findViewById(R.id.iv_if);
    }

    public void save(View v) throws IOException {
        // 1. 得到InputStream-->读取assets下的logo.png
        // 得到AssetManager
        AssetManager manager = getAssets();
        // 读取文件
        InputStream is = manager.open("logo.png");

        //2. 得到OutputStream-->/data/data/packageName/files/logo.png
        FileOutputStream fos = openFileOutput("logo.png", Context.MODE_PRIVATE);

        //3. 边读边写
        byte[] buffer = new byte[1024];
        int len = -1;
        while((len=is.read(buffer))!=-1) {
            fos.write(buffer, 0, len);
        }
        fos.close();
        is.close();

        //4. 提示
        Toast.makeText(this, "保存完成", 0).show();
    }

    public void read(View v) {  // /data/data/packageName/files/logo.png
        //1. 得到图片文件的路径
        // /data/data/packageName/files
        String filesPath = getFilesDir().getAbsolutePath();
        String imagePath = filesPath+"/logo.png";
        
        //2. 读取加载图片文件得到bitmap对象
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
        
        //3. 将其设置到imageView中显示
        iv_if.setImageBitmap(bitmap);
    }
}

手机外部文件存储

手机外部文件存储说明

应用运行用到的数据文件(比如图片)可以保存到sd卡中

保存的文件类型是任意的

必须保证sd卡挂载在手机上才能读写,否则不能操作

数据保存路径:

路径1: /storage/sdcard/Android/data/packageName/files/         (其他应用可以访问,卸载应用时删除)

路径2:  /storage/sdcard/xxx/      (其他应用可以访问,卸载应用时不会删除)

相关API

在调用getExternalFilesDir方法获取files存储路径的时候可以传入参数(文件类型参数)

如果传入的type参数是null,那么默认是string,得到的路径就是:/storage/sdcard/Android/data/packageName/files/xxx.txt,

如果type是: Environment.DIRECTORY_MUSIC的时候,得到的路径会在往下生成文件夹,就是:/storage/sdcard/Android/data/packageName/files/movies/xxxx,

打开操作sd卡的权限

保存读取数据操作1

路径1: /storage/sdcard/Android/data/packageName/files/         

其他应用可以访问,卸载应用时删除

package com.example.sharedpreferences;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class OFActivity extends Activity {

    private EditText et_of_name;
    private EditText et_of_content;

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

        et_of_name = (EditText) findViewById(R.id.et_of_name);
        et_of_content = (EditText) findViewById(R.id.et_of_content);
    }

    public void save(View v) throws IOException {
        // 1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            // 2. 读取输入的文件名/内容
            String fileName = et_of_name.getText().toString();
            String content = et_of_content.getText().toString();

            //3. 得到指定文件的OutputStream
            //1).得到sd卡下的files路径
            String filesPath = getExternalFilesDir(null).getAbsolutePath();
            //2).组成完整路径
            String filePath = filesPath+"/"+fileName;
            //3). 创建FileOutputStream
            FileOutputStream fos = new FileOutputStream(filePath);
            //4. 写数据
            fos.write(content.getBytes("utf-8"));
            fos.close();
            //5. 提示
            Toast.makeText(this, "保存完成", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
        }
    }

    public void read(View v) throws Exception {
        // 1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            // 2. 读取输入的文件名
            String fileName = et_of_name.getText().toString();
            // 3. 得到指定文件的InputStream
            // 1).得到sd卡下的files路径
            String filesPath = getExternalFilesDir(null).getAbsolutePath();
            // 2).组成完整路径
            String filePath = filesPath + "/" + fileName;
            // 3). 创建FileInputStream
            FileInputStream fis = new FileInputStream(filePath);
            // 4. 读取数据, 成String
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while((len=fis.read(buffer))!=-1) {
                baos.write(buffer, 0, len);
            }
            String content = baos.toString();

            // 5. 显示
            et_of_content.setText(content);
        } else {
            Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
        }
    }
}

保存读取数据操作2

路径2:  /storage/sdcard/xxx/     

其他应用可以访问,卸载应用时不会删除

package com.example.sharedpreferences;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

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

public class OFActivity extends Activity {

    private EditText et_of_name;
    private EditText et_of_content;

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

        et_of_name = (EditText) findViewById(R.id.et_of_name);
        et_of_content = (EditText) findViewById(R.id.et_of_content);
    }

    //  /storage/sdcard/study/xxx.txt
    public void save(View v) throws IOException {
        //1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            //2. 读取输入的文件名/内容
            String fileName = et_of_name.getText().toString();
            String content = et_of_content.getText().toString();
            //3. 得到指定文件的OutputStream
            //1). /storage/sdcard/
            String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
            //2). /storage/sdcard/study/(创建文件夹)
            File file = new File(sdPath+"/study");
            if(!file.exists()) {
                file.mkdirs();//创建文件夹
            }
            //3). /storage/sdcard/study/xxx.txt
            String filePath = sdPath+"/study/"+fileName;
            //4). 创建输出流
            FileOutputStream fos = new FileOutputStream(filePath);
            //4. 写数据
            fos.write(content.getBytes("utf-8"));
            fos.close();
            //5. 提示
            Toast.makeText(this, "保存完成", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
        }
    }

    public void read(View v) throws Exception {
        // 1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            // 2. 读取输入的文件名
            String fileName = et_of_name.getText().toString();
            // 3. 得到指定文件的InputStream
            String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
            String filePath = sdPath+"/study/"+fileName;
            FileInputStream fis = new FileInputStream(filePath);
            // 4. 读取数据, 成String
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while((len=fis.read(buffer))!=-1) {
                baos.write(buffer, 0, len);
            }
            String content = baos.toString();
            fis.close();
            // 5. 显示
            et_of_content.setText(content);
        } else {
            Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_SHORT).show();
        }
    }
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐