Android学习之数据存储方式java

今天咱们主要学习前两种数据存储方式。

一、SharedPreferences存储数据

(1)、一种经常使用的数据存储方式。

(2)、本质是基于xml文件存储键值对(key-value)数据。

(3)、其只能读取数据,存储和修改须要经过Editor对象实现。

(4)、SharedPreferences将数据以键值对(key-value)的形式保存至xml文件中,而生成的xml文件保存于/data/data/程序包名/shared_prefs目录下。

(5)、SharedPreferences的使用很是简单,可以轻松的存放数据和读取数据,但只能保存基本类型的值 ,因此,适用于简单的数据保存,通常用于变量的存储。

1.一、SharedPreferences对象的经常使用方法:web

方法

说明

contains(String key)

判断SharedPreferences是否包含特定名称为键(key)的数据,返回值类型为boolean,是返回true,否返回false。

edit()

获取SharedPreferences数据里所有的键值对(key-value),返回值类型为Map。

getAll()

返回一个Edit对象,用于操做SharedPreferences,返回值类型为Editor。

getXxx(String key, Xxx defValue)

获取SharedPreferences指定键(key)所对应的值(value),其中Xxx表示不一样的数据类型。

1.二、SharedPreferences.Editor对象的经常使用方法 :数据库

方法

说明

clear()

清空SharedPreferences里全部的数据。

putXxx(String key,Xxx value)

向SharedPreferences存入指定的key对应的数据,其中Xxx与以前所述相同同样,表示不一样的数据类型。

commit()

当Editor编辑完成后,调用该方法能够提交修改,至关于数据库中的提交操做。不管对SharedPreferences对象进行了什么操做,最后都必须使用commit()方法进行保存,不然将没法存储修改信息。返回值类型为boolean,提交成功返回true,失败返回false。

remove(String key)

删除SharedPreferences里指定key对应的值。返回值类型为Editor。

1.三、SharePreferences的四种操做方式 :数组

方法

说明

Context.MODE_PRIVATE

默认操做,SharePreferences数据只能被本应用程序读、写,写入的内容会覆盖原文件的内容。

Context.MODE_APPEND

检查SharePreferences文件是否存在,没有就建立新的SharePreferences文件或存在就追加写入SharePreferences文件中。

Context.MODE_WORLD_READABLE

SharePreferences文件可被其余应用读取,可是不能写入。

Context.MODE_WORLD_WRITEABLE

SharePreferences文件可被其余应用读取并写入。

1.四、两种获取SharedPreferences对象的方法

(1)、使用Contex.getSharedPreferences(String name,int mode)获取.

Name为配置文件的名称,mode为操做方式,可被同一应用程序下的其余组件共享。

(2)、使用Activity.getPreferences(int mode)获取.

(只能在本Activity中使用。

1.五、使用SharedPreferences存取数据

保存数据:

1.经过Context或Activity获取SharePreferences对象

2.使用SharePreferences的edit获取SharePreferences.Editor对象

3.使用Editor对象的putXXX方法保存key-value数据对

4.使用Editor对象的commit方法提交数据,进行实际存储

获取数据:

1.经过Context或Activity获取SharePreferences对象

2.使用SharePreferences对象的getXXX方法来获取数据网络

二、文件存储数据

文件存储能够分红两类 :

一、将文件存储在应用程序内,文件保存在/data/data//files/目录下,称为File存储;

二、将文件存储在外接的存储设备中,也就是存储在SDCard存储卡中,称为SDCard存储。

2.一、File存储

Android中读取/写入文件的方法与java中的I/O操做同样。利用openFileInput()方法与FileInputStream()对象读取设备上的文件,并利用openFileOutput()方法与FileOutputStream()对象来建立文件,但File存储下,文件在不一样的程序之间不能共享。

2.1.一、使用FileOutputStream类对象来建立文件信息:

• 使用OpenFileOutput(string name, int mode)函数建立对象,name为文件名,不须要路径信息和扩展名;mode为操做方式。

• 使用对象的.write(byte[] bytes)来写入二进制文件流,若为其它类型数据,则须要转换为二进制类型。

• 使用对象的.close()来关闭对象。app

2.1.二、使用FileInputStream类对象来读取文件信息:

• openFileInput(String name)建立对象。

• 使用对象的.read(byte[] bytes)来读取二进制文件流。

• 将读取的二进制数据流,转换为本来的数据信息。less

2.1.三、File存储经常使用操做:ide

方法

说明

openFileOutput(String name, int mode)

保存文件内容,打开指定的私有文件输出流,返回值类型为FileOutputStream,name为要打开的文件名,不能包含路径分隔符,mode四种模式以下,在使用模式时,能够用"+"来选择多种模式,好比openFileOutput(FileName, Environment.MODE_PRIVATE+MODE_WORLD_READABLE)。

openFileInput(String name)

读取文件内容,打开指定的私有文件输出流,返回值类型为FileInputStream,name为要打开的文件名,不能包含路径分隔符,对于File存储所建立的文件只能被建立该文件的应用访问,若是但愿文件能被其余应用读和写,能够在建立文件时,指定Environment.MODE_WORLD_READABLE和Environment.MODE_WORLD_WRITEABLE权限。

deleteFile(String name)

删除指定的文件,返回值类型为boolean,name为要删除的文件名,不能包含路径。

getDir(String name, int mode)

在应用程序的数据文件下获取或建立name对应的子目录,返回值类型为File。

getFilesDir()

获得该应用程序数据文件夹的绝对路径,返回值类型为File。

fileList()

获得该应用程序数据文件夹下的所有文件的文件名,返回值类型为String[]。

• mode为操做模式,有如下4种保存模式:

Environment.MODE_PRIVATE:为默认操做模式,表明该文件是私有数据,只能被应用自己访问,在该模式下写入的内容会覆盖原文件的内容。

Environment.MODE_APPEND:检查文件是否存在,存在就往文件追加内容,不然就建立新文件。

Environment.MODE_WORLD_READABLE:表示当前文件能够被其余应用读取。

Environment.MODE_WORLD_WRITEABLE:表示当前文件能够被其余应用写入。svg

2.二、SDCard存储

Android为咱们提供了SDCard的相关方法方便咱们的操做。

2.2.一、Environment类的经常使用方法:

方法

说明

getDataDirectory()

得到Android下的data文件夹的目录,返回值类型为File。

getDownloadCacheDirectory()

得到AndroidDownload/Cache内容的目录,返回值类型为File。

getExternalStorageDirectory()

得到Android外部存储器也就是SDCard的目录,返回值类型为File。

getRootDirectory()

得到Android下的root文件夹的目录,返回值类型为File。

getExternalStorageState()

得到Android外部存储器的当前状态,返回值类型为String,有如下几种保存模式。

•保存模式:

Environment.MEDIA_BAD_REMOVAL:在没有正确卸载SDCard以前就移除。

Environment.MEDIA_CHECKING:正在磁盘检查。

Environment.MEDIA_MOUNTED:已经挂载而且拥有可读可写权限。

Environment.MEDIA_MOUNTED_READ_ONLY:已经挂载, 但只拥有可读权限。

Environment.MEDIA_NOFS:对象空白, 或者文件系统不支持。

Environment.MEDIA_REMOVED:已经移除扩展设备。

Environment.MEDIA_SHARED:若是SDCard未挂载, 同时经过USB大容量存储方式与其余设备共享。

Environment.MEDIA_UNMOUNTABLE:不能够挂载任何扩展设备。

Environment.MEDIA_UNMOUNTED:已经卸载。

2.2.二、对SDCard的写入与读取操做:

•1. 在AndroidMainfest.xml中添加权限。

在API23以上,还要在JAVA代码中添加请求权限:

// Storage Permissions

private static final int REQUEST_EXTERNAL_STORAGE = 1;

private static String[] PERMISSIONS_STORAGE = {

Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.WRITE_EXTERNAL_STORAGE};

public static void verifyStoragePermissions(AppCompatActivity activity) {

int permission = ActivityCompat.checkSelfPermission(activity,

Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,

REQUEST_EXTERNAL_STORAGE);

}

}

•2. 判断手机设备上是否有SDCard且具备读写SDCard的权限,用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)来判断。

•3.获取SD卡的目录。

File sdCardDir=Enviroment.getExternalStorageDirectory()。

或File sdCardDir=new File(“/sdcard”); //直接访问默认目录。

☆☆☆•4.使用File类来写入SD卡文件。

•使用File类的构造函数设置SD卡文件,并指明路径和名称。

File savefile=new File(String dir, String filename)。

•建立FileOutputStream类对象来绑定File对象。

FileOutputStream fos= new FileOutputStream(savefile)。

•经过FileOutputStream类对象将数据流写入到文件中。

fos.write(byte[] bytes)。

☆☆☆•5.使用File类来读取SD卡文件。

•使用File类的构造函数设置SD卡文件,并指明路径和名称。

File readfile=new File(String dir, String filename)。

•建立FileInputStream类对象来绑定File对象。

FileInputStream fis= new FileOutputStream(readfile)。

•经过FileInputStream类对象将数据流写入到文件中。

定义一个byte[] 数组,用来存放读取的二进制数据流。

使用fis.read(byte[] bytes)的方法,从文件读取二进制数据流。

将二进制数据转化为原有的数据类型。

☆☆☆Android Studio实现SharedPreferences存储数据和文件File存储数据。

1.打开Android Studio,新建工程后,在activity_main.xml中,创建4个Button,2个Plain Text。

dedc20cbf45d7ed143e310b2c77ab012.png

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="lession.example.com.androidlession4_10_3.MainActivity">

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_alignParentTop="true"

android:layout_alignParentEnd="true">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textPersonName"

android:text="name"

android:ems="10"

android:id="@+id/editText" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textPersonName"

android:text="pwd"

android:ems="10"

android:id="@+id/editText2" />

android:text="sp_save"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button" />

android:text="sp_load"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button2" />

android:text="data_save"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button3" />

android:text="data_load"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button4" />

2.在MainActivity.java中,编写相关代码。

package lession.example.com.androidlession4_10_3;

import android.content.Context;

import android.content.SharedPreferences;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import java.io.FileInputStream;

import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

SharedPreferences msp;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

msp = getSharedPreferences("myfile", Context.MODE_PRIVATE);

final EditText ed_name = (EditText) findViewById(R.id.editText);

final EditText ed_pwd = (EditText) findViewById(R.id.editText2);

Button bt_sps = (Button) findViewById(R.id.button);

Button bt_spl = (Button) findViewById(R.id.button2);

Button bt_datas = (Button) findViewById(R.id.button3);

Button bt_datal = (Button) findViewById(R.id.button4);

bt_sps.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

SharedPreferences.Editor mEdt = msp.edit();

mEdt.putString("name",ed_name.getText().toString());

mEdt.putString("pwd",ed_pwd.getText().toString());

mEdt.commit();

}

});

bt_spl.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

ed_name.setText(msp.getString("name",null));

ed_pwd.setText(msp.getString("pwd",null));

}

});

bt_datas.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

try {

FileOutputStream mfos = openFileOutput("datafile",MODE_PRIVATE);

String st = ed_name.getText().toString();

byte[ ] buffer = st.getBytes();

mfos.write(buffer);

mfos.flush();

mfos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

});

bt_datal.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

try {

FileInputStream mfis = openFileInput("datafile");

int len = mfis.available();

byte[ ] buffer = new byte[len];

mfis.read(buffer);

String st = new String(buffer);

ed_pwd.setText(st);

}catch (Exception e){

e.printStackTrace();

}

}

});

}

}

运行结果:

SharedPreferences存储数据:

输入任意姓名和密码,点击SP_SAVE,清除文本框中内容后,点击SP_LOAD,输入的姓名和学号又会显示出来。

fedefcc3a6e5554474f206985feed77b.png

打开Tools —> Android —> Android Device Monitor,找到myfile。

注:若是打开Android Device Monitor没有目录树,请参考个人另外一篇博客,连接:https://blog.csdn.net/weixin_43468667/article/details/90214551

87526f4c02aeca3637c2a51c5d19c5d7.png

导出,打开内容以下:

6f3934bbc08de9c52b00c8b347acebeb.png

文件File存储数据:

在第一个文本框输入任意字符,点击DATA_SAVE,点击DATA_LOAD,在第二个文本框显示出来。

835e8ca7ffd66cf3ff2f805e4566a369.png

打开Tools —> Android —> Android Device Monitor,找到datafile。

c8d9871945cd9049a542d9eefc1832d0.png

导出,打开内容以下:

76f9258f0d1b645df81c08ed4f7f8df4.png

☆☆☆Android Studio实现文件SDCard存储数据。

1.打开Android Studio,新建工程后,在AndroidMainfest.xml中添加权限。

package="lession.example.com.androidlession417">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

2.在activity_main.xml中,创建3个Button,1个ListView。

03760f7e9b0ff6d54d8c761534aa2335.png

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="lession.example.com.androidlession417.MainActivity">

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:text="sd_save"

android:textAllCaps="false"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button" />

android:text="sd_load"

android:textAllCaps="false"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button2" />

android:text="sd_dir"

android:textAllCaps="false"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button3" />

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/listView" />

3.在MainActivity.java中,编写相关代码。

package lession.example.com.androidlession417;

import android.Manifest;

import android.content.pm.PackageManager;

import android.os.Environment;

import android.support.v4.app.ActivityCompat;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

import android.widget.Toast;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

// Storage Permissions

private static final int REQUEST_EXTERNAL_STORAGE = 1;

private static String[] PERMISSIONS_STORAGE = {

Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.WRITE_EXTERNAL_STORAGE};

public static void verifyStoragePermissions(AppCompatActivity activity) {

int permission = ActivityCompat.checkSelfPermission(activity,

Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,

REQUEST_EXTERNAL_STORAGE);

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button bt_sdsave = (Button) findViewById(R.id.button);

Button bt_sdsload = (Button) findViewById(R.id.button2);

Button bt_sddir = (Button) findViewById(R.id.button3);

final ListView lv = (ListView) findViewById(R.id.listView);

verifyStoragePermissions(this);

bt_sdsave.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

File path = Environment.getExternalStorageDirectory();

String st = "我要写入的文件的内容!";

File saveFile = new File(path,"mySDfile");

try {

FileOutputStream mfos = new FileOutputStream(saveFile);

mfos.write(st.getBytes());

mfos.flush();

mfos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

});

bt_sdsload.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

File path = Environment.getExternalStorageDirectory();

String st;

File loadFile = new File(path,"mySDfile");

try{

FileInputStream mfis = new FileInputStream(loadFile);

int len = mfis.available();

byte[] buffer = new byte[len];

mfis.read(buffer);

st = new String(buffer);

Toast.makeText(MainActivity.this,

"文件内容:"+st,Toast.LENGTH_LONG).show();

}catch (Exception e){

e.printStackTrace();

}

}

});

/*遍历SD卡中目录及文件的方法:

经过建立File[]数组类型对象获取

File[] files=new File(filepath).listFiles();

使用ListView控件来显示目录

使用ArrayAdapter将目录中的信息,绑定到ListView中显示

使用ListView控件的点击事件,来进入选中的目录

主要函数实现:

获取选定文件夹中的文件列表

将文件列表显示到到ListView中*/

bt_sddir.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

File path = Environment.getExternalStorageDirectory();

File[] mFs = new File(path.toString()).listFiles();

ArrayAdapter mAda = new ArrayAdapter

(MainActivity.this,android.R.layout.simple_list_item_1,mFs);

lv.setAdapter(mAda);

}

});

}

}

运行结果:

点击ALLOW

a7a242b6572163cde157e5044a98282a.png

实现SD卡文件的读写:

点击sd_save,而后点击sd_load显示保存的内容

实现遍历SD卡中目录及文件:

点击sd_dir,ListView显示内容

c4ff0e1d8a96bb695d8e8d18f0000a23.png

打开Tools —> Android —> Android Device Monitor,找到对应文件。

073aa8228b0404fefaa281b74737371a.png

导出,打开内容以下:

db6f4a17783e9f860732fe3bf84ea344.png

这就是SharedPreferences存储数据和文件存储数据的使用,若是转载以及CV操做,请务必注明出处,谢谢!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐