Android安卓——数据存储之文件存储

在安卓中对数据的存储有了SQLite数据库存储数据,在本次学习的是对文件的存储。利用SharedPerences将数据存储在文件中。
实战:本次学习准备的实战是总结性写了一下数据内部存储的读写、文件内部存储的读写、在SD卡中的读写。

一、 简单存储SharedPreferences

1、简单存储简介

  • SharedPreferences是一种轻量级的数据保存方式。
  • 通过SharedPreferences可以将NVP(Name/Value Pair,名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的操作过程。
  • 开发人员仅是通过调用SharedPreferences对NVP进行保存和读取。

2、应用程序间数据共享的三种访问模式

  • SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享
  • SharedPreferences支持三种访问模式
    • 私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入
    • 全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限
    • 全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限

3、SharedPreferences创建和使用步骤

1).在使用SharedPreferences前,先定义SharedPreferences的访问模式
  • 下面的代码将访问模式定义为私有模式
public static int MODE = MODE_PRIVATE;
  • 有的时候需要将SharedPreferences的访问模式设定为即可以全局读,也可以全局写,这样就需要将两种模式写成下面的方式
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
2).定义SharedPreferences的名称
  • SharedPreferences的名称与在Android文件系统中保存的文件同名。因此,只要具有相同的SharedPreferences名称的NVP内容,都会保存在同一个文件中
public static final String PREFERENCE_NAME = "SaveSetting";
  • 为了可以使用SharedPreferences,需要将访问模式和SharedPreferences名称作为参数,传递到getSharedPreferences()函数,并获取到SharedPreferences对象
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);
3).修改共享的具体数据
  • 在获取到SharedPreferences对象后,则可以通过SharedPreferences.Editor类对SharedPreferences进行修改,最后调用commit()函数保存修改内容
  • SharedPreferences广泛支持各种基本数据类型,包括整型、布尔型、浮点型和长型等等
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("Name", "Tom");    
editor.putInt("Age", 20);
editor.putFloat("Height", );        
editor.commit();
4).读取共享的数据
  • 如果需要从已经保存的SharedPreferences中读取数据,同样是调用getSharedPreferences()函数,并在函数的第1个参数中指明需要访问的SharedPreferences名称,第二个参数为默认参数(无法获取到数值的时候使用的缺省值)。最后通过getXXX()函数获取保存在SharedPreferences中的NVP。
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);
String name = sharedPreferences.getString("Name","Default Name");
int age = sharedPreferences.getInt("Age", 20);
float height = sharedPreferences.getFloat("Height",);

4、访问其他应用程序的SharedPreferences必须满足三个条件

  • 共享者需要将SharedPreferences的访问模式设置为全局读或全局写
  • 访问者需要知道共享者的包名称和SharedPreferences的名称,以通过Context获得SharedPreferences对象
  • 访问者需要确切知道每个数据的名称和数据类型,用以正确读取数据

二、文件存储

Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件。

(一)、内部存储

  • Android系统允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内部存储器上,在Linux系统下的/data/data/package name/files目录中
  • Android系统不仅支持标准Java的IO类和方法,还提供了能够简化读写流式文件过程的函数
  • 主要介绍的两个函数openFileOutput()、openFileInput()
1、openFileOutput()函数
  • openFileOutput()函数为写入数据做准备而打开的应用程序私文件,如果指定的文件不存在,则创建一个新的文件。
  • openFileOutput()函数的语法格式如下
public FileOutputStream openFileOutput(String name, int mode)

 第1个参数是文件名称,这个参数不可以包含描述路径的斜杠
 第2个参数是操作模式
 函数的返回值是FileOutputStream类型
Android系统支持四种文件操作模式

模式 说明
MODE_PRIVATE 私有模式,缺省模式,文件仅能够被文件创建程序访问,或者具有相同UID的程序访问。
MODE_APPEND 追加模式,如果文件已经存在了,则在该文件的结尾处添加新数据。
MODE_WORLD_READABLE 全局读模式,允许任何程序读取私有文件
MODE_WORLD_WRITEABLE 全局写模式,允许任何程序写入私有文件。

使用openFileOutput()函数建立新文件的示例代码如下

String FILE_NAME = "fileDemo.txt";
FileOutputStream fos =openFileOutput(FILE_NAME,Context.MODE_PRIVATE)
String text = “Some data”;
fos.write(text.getBytes());
fos.flush();
fos.close();

 第1行代码定义了建立文件的名称fileDemo.txt
 第2行代码使用openFileOutput()函数以私有模式建立文件
 第4行代码调用write()函数将数据写入文件
 第5行代码调用flush()函数将所有剩余的数据写入文件
 第6行代码调用close()函数关闭FileOutputStream

为了提高文件系统的性能,一般调用write()函数时,如果写入的数据量较小,系统会把数据保存在数据缓冲区中,等数据量累积到一定程度时再一次性的写入文件中
由上可知,在调用close()函数关闭文件前,务必要调用flush()函数,将缓冲区内所有的数据写入文件

2、openFileInput()函数
  • openFileInput()函数为读取数据做准备而打开应用程序私文件
  • openFileInput()函数的语法格式如下
public FileInputStream openFileInput (String name)

 第1个参数也是文件名称,同样不允许包含描述路径的斜杠
使用openFileInput ()函数打开已有文件的示例代码如下

String FILE_NAME = "fileDemo.txt";
FileInputStream fis = openFileInput(FILE_NAME);
byte[] readBytes = new byte[fis.available()];
while(fis.read(readBytes) != -1){
}

(二)外部存储

Android的外部存储设备指的是SD卡(Secure Digital Memory Card),是一种广泛使用于数码设备上的记忆卡。不是所有的Android手机都有SD卡,但Android系统提供了对SD卡的便捷的访问方法。SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件,可以保存录制的大容量的视频文件和音频文件等SD卡使用的是FAT(File Allocation Table)的文件系统,不支持访问模式和权限控制,但可以通过Linux文件系统的文件访问权限的控制保证文件的私密性Android模拟器支持SD卡,模拟器中有缺省的SD卡,如果想在多个模拟器中共享相同的SD卡,则开发人员须在模拟器中手工添加SD卡的映像文件。

三、实战

在这里我主要针对此次学习给出了实战代码,该代码实现了数据的文件存储的读写。

public class FileActivity extends AppCompatActivity {
    public static int MODE = MODE_PRIVATE; //设置私有模式
    //设置全局读、全局写两种模式
public static int MODE_twe = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
//设置SharedPreferences的名称.在使用SharedPreferences时,需要给出名称作为参数,该名称相同就会保存在同一个文件中
    public static final String PREFERECE_NAME = "mypref";
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file);
    }
    public void writePref(View view){
        /**
         * 写数据(二进制类型)
         */
        //使用getSharedPreferences方法,传输文件名称,类型。获取到SharedPreferences对象
        SharedPreferences sharedPreferences = getSharedPreferences(PREFERECE_NAME,MODE_APPEND);
        //使用Editor类来对SharedPreferences进行修改
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("ip","192.168.1.106");
        editor.putString("port","8080");
        editor.commit();//进行保存
    }
    public void readPref(View view){
        /**
         * 读数据
         */
        //使用getSharedPreferences方法,传输文件名称,类型。获取到SharedPreferences对象
        SharedPreferences sharedPreferences = getSharedPreferences(PREFERECE_NAME,MODE_APPEND);
        //使用getXXX的方法直接读取数据,第二个参数是默认参数()当读取不成功时的取值
        String ip = sharedPreferences.getString("ip","");
        String port = sharedPreferences.getString("port","");
        Toast.makeText(this,"ip:"+ip+"port:"+port,Toast.LENGTH_SHORT).show();
    }
    /**
     * 下面读写的文件都是保存在内部存储器上的。Linux系统下的/data/data//files目录中
     */
    public void writeFile(View view){
        /**
         * 写文件openFileOutput
         */
        try{
            FileOutputStream fileOutputStream = openFileOutput(PREFERECE_NAME,MODE_APPEND);
            String content = "fileContent";
            fileOutputStream.write(content.getBytes());
            fileOutputStream.flush();
        }catch(Exception e){
            Log.e(FileActivity.class.toString(),e.toString());
        }
    }
    public void readFile(View view){
        /**
         * 读文件openFileInput
         */
        try {
            FileInputStream fileInputStream = openFileInput(PREFERECE_NAME);
            byte[] bytes = new byte[fileInputStream.available()];
            fileInputStream.read(bytes);
            String content = new String(bytes);
            Toast.makeText(this,content,Toast.LENGTH_SHORT).show();

        }catch (Exception e){
            Log.e(FileActivity.class.toString(),e.toString());
        }
    }
    public void writeSD(View view){
        /**
         * 写SD卡文件
         */
        try {
            File file = new File(Environment.getExternalStorageDirectory(),"mysdfile");
            file.createNewFile();
            if(file.exists()&&file.canWrite()){
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                String content = "fileContent.txt";
                fileOutputStream.write(content.getBytes());
                fileOutputStream.flush();
                fileOutputStream.close();
            }
        }catch (Exception e){
            Log.e(FileActivity.class.toString(),e.toString());
        }
    }
}

你可能感兴趣的:(安卓入门开发)