Android数据存储方式一:sharedprefrence存储,外部存储,内部存储

news/2024/7/7 12:25:24

Android数据存储方式

SharedPrefrence存储

说明

SP存储专门用来存储一些单一的小数据

存储数据的类型: boolean, float, int, long, String

数据保存的路径: /data/data/packageName/shared_prefs/yyy.xml

可以设置数据只能是当前应用读取, 而别的应用不可以

应用卸载时会删除此数据

相关API

SharedPreferences: 对应sp文件的接口

context. getSharedPreferences (String name, int mode): 得到SP对象

name: 文件名(不带.xml)

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

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

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

Editor : 能更新sp文件的接口

Editor put(name, value) : 保存一个键值对, 没有真正保存到文件中

Editor remove(name)

commit(): 提交, 数据真正保存到文件中了

手机内部文件存储

说明

应用运行需要的一些较大的数据或图片可以用文件保存的手机内部

文件类型: 任意

数据保存的路径: /data/data/projectPackage/files/

可以设置数据只能是当前应用读取, 而别的应用不可以

应用卸载时会删除此数据

相关API

读取文件

FileInputStream fis = openFileInput(“logo.png”);

保存文件

FileOutputStream fos = openFileOutput(“logo.png”, MODE_PRIVATE)

得到files文件夹对象

File filesDir = getFilesDir();

操作asserts下的文件

得到AssetManager : context.getAssets();

读取文件: InputStream open(filename);
加载图片文件

Bitmap BitmapFactory.decodeFile(String pathName) // .bmp/.png/.jpg

比如保存并读取assets下的代码
public void save(View view) 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", MODE_PRIVATE);
    //3.边读边写
    byte[] buffer = new byte[1024];
    int len = -1;
    while ((len = is.read(buffer)) != -1) {
        fos.write(buffer);
    }
    //4.关闭
    is.close();
    fos.close();
    //5.提示
    Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();
}

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

手机外部文件存储

说明

应用运行用到的数据文件(如图片)可以保存到sd卡中
文件类型: 任意
数据保存的路径:

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

路径2: /storage/sdcard/xxx/

路径1 :其它应用可以访问,应用卸载时删除
路径2 : 其它应用可以访问, 应用卸载时不会删除
必须保证sd卡挂载在手机上才能读写, 否则不能操作

相关API

Environment : 操作SD卡的工具类

得到SD卡的状态:Environment.getExternalStorageState()

得到SD卡的路径:Environment.getExternalStorageDirectory()

SD卡可读写的挂载状态值:Environment.MEDIA_MOUNTED

context. getExternalFilesDir():

得到/mnt/sdcard/Android/data/pageckage_name/files/xxx.txt

操作SD卡的权限:

android.permission.WRITE_EXTERNAL_STORAGE

实现文件保存——路径1:其它应用可以访问,应用卸载时删除
 public void save(View view) throws Exception {
    //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 filePath = getExternalFilesDir(null).getAbsolutePath();
        //2).组成完整路径
        String path = filePath + "/" + fileName + ".txt";
        //3). 创建FileOutputStream
        FileOutputStream fos = new FileOutputStream(path);
        //4. 写数据
        fos.write(content.getBytes("utf-8"));
        fos.close();
        //5.提示
        Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();

    } else {
        Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_LONG).show();
    }
}

public void read(View view) 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 filePath = getExternalFilesDir(null).getAbsolutePath();
        //2).组成完整路径
        String path = filePath + "/" + fileName + ".txt";// 1.txt
        //3). 创建FileInputStream
        FileInputStream fis = new FileInputStream(path);
        //4. 读数据 OutputStream提供了write方法来做数据的输出,这个是和InputStream是相对应的。
        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_LONG).show();
    }
}

文件保存——路径2:其他应用可以访问,应用卸载后不删除

 //  /storage/sdcard/dongge/xxx.txt
public void save2(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路径:/storage/sdcard/xxx/
        String filePath = Environment.getExternalStorageDirectory().getPath();
        String sdPath = filePath + "/dongge";
        File file = new File(sdPath);
        if (!file.exists()) {
            //创建文件夹
            file.mkdirs();
        }
        //2).组成完整路径
        String path = filePath + "/dongge/" + fileName + ".txt";
        //3). 创建FileOutputStream
        FileOutputStream fos = new FileOutputStream(path);
        //4. 写数据
        fos.write(content.getBytes("utf-8"));
        fos.close();
        //5.提示
        Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();

    } else {
        Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_LONG).show();
    }
}

public void read2(View view) 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 filePath = Environment.getExternalStorageDirectory().getAbsolutePath();


        //2).组成完整路径
        String path = filePath + "/dongge/" + fileName + ".txt";
        //3). 创建FileInputStream
        FileInputStream fis = new FileInputStream(path);
        //4. 读数据 OutputStream提供了write方法来做数据的输出,这个是和InputStream是相对应的。
        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();
        //关闭
        baos.close();
        fis.close();
        //5.提示
        et_of_content.setText(content);

    } else {
        Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_LONG).show();
    }
}

http://www.niftyadmin.cn/n/3648998.html

相关文章

Android中保存Activity的状态

1.onSaveInstanceState和onRestoreInstanceState基本作用onSaveInstanceState是用来保存UI状态的,你可以使用它保存你所想保存的东西,在Activity杀死之前,它一般在onStop或者onPause之前触发,onRestoreInstanceState则是在onResum…

如何在React App Server上渲染CSS

Server-side rendering can be challenging due to ambiguity. Open-source tools like Next.js (React) and Nuxt.js(Vue) help streamline the process of rendering your app views to a server. 由于含糊不清,服务器端渲染可能具有挑战性。 诸如Next.js (React…

Android存储方式二:sqlite数据库

说明 应用运行需要保存一系列有一定结构的数据, 比如说公司员工信息 文件类型: .db 数据保存的路径: /data/data/projectPackage/databases/xxx.db 默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作 应用卸载时会删除此数据 sqlite数据库 …

事件机制分发

相关API 1. MotionEvent : 触屏事件 int ACTION_DOWN0 : 代表down int ACTION_MOVE2 ; 代表move int ACTION_UP1 : 代表up getAction() : 得到事件类型值 getX() : 得到事件发生的x轴坐标(相对于当前视图) getRawX() :得到事件发生的x轴坐标(相对于屏幕左顶点) getY() …

Android TabActivity的生命周期

在TabActivity中,只在第一次进入时走了onCreate()、onStart()、onResume()三个阶段,然后在退出该页面时走了onPause()、onStop()和onDestroy()两个阶段。其他时间无论其中的子Activity如何切换,都不会再进入TabActivity的生命周期。 而子Acti…

three.js使用svg_如何使用SVG和anime.js构建弹性范围输入

three.js使用svg介绍 (Introduction) In HTML5, many new types of input attributes were introduced for the form element, such as color, date, range, and many more. Although functionally these new types of input works, they often do not meet the aesthetic need…

我们正处在IT殖民时代,需要突破的勇气,或者就这样继续下去...

IT殖民地,似乎有点危言耸听。但是从客观的事实来看,这个称呼并不离奇,尤其在企业级市场上(IT消费品市场还好些)。我们的操作系统都是Windows、AIX、HP-UX、Solaris,Redhat Linux,SuSE Linux&…

Android 使用Fragment 替换 TabActivity

可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 1、使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。 如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来…