继上篇数据存储,现在我们来讲讲另外一种数据存储,Files。本篇讲述步骤如下:

  • 1、温故而知新,复习四种数据存储的区别。
  • 2、什么是 Files 数据存储。
  • 3、什么是 Properties ?
  • 4、Properties 重要方法和属性讲解。
  • 5、模拟用户设置参数。
  • 6、查看 Files 产生的文件。
1、温故而知新,复习四种数据存储的区别
Android 总共有4种数据存储方式,具体解释和列表如下:

  • Shared Preferences 
    用来存储“键-值”对的格式数据。是一个轻量级的键值对存储机制,只可以存储基本数据类型。
    你可以参考上篇文章了解和使用它的用法:Android 小项目之--数据存储【Shared Preferences】(附源码)
  • Files
    它通过 FileInputStream 和 FileOutputStream 对文件进行操作。本篇将讲述如何使用Files 数据存储。
  • SQLite
    Android 提供的一个标准数据库,支持SQL语句。
    你可以参考这篇文章大致了解和使用它的用法:Android 小项目之--SQLite 使用法门 (附源码)
  • NetWork
    通过网络来存储和获得数据。
2、什么是 Files 数据存储
  • File 就是把需要保存的东西通过文件的形式讯录下来,当需要这些数据时,通过读取这个文件来获取这些数据。因为 Android 采用了 Linux 核心,所以在Android 系统中,文件也是Linux 的形式。
  • Android 中可以在设备本身的的存储或者外接的存储设备中创建用于保存数据的文件。同时,在默认状态下,文件是不能在不同的程序间共享的。
3、什么是 Properties ?
Properties(属性),可以把Properties继承自Hashtable,理解成一个Hashtable ,不过唯一不同的是,Properties对应的“键-值”必须是字符串形式的数据类型。Files 数据存储主要是使用 Properties 配合 FileInputStream或者FileOutputStream对文件写入操作。 
4、Properties 重要方法和属性讲解
公用方法:
  • 返回值:String 
    方法:getProperty(String name, String defaultValue)
    解释:通过指定的 “name“ 即Key,搜索属性,参数二为默认值,即通过Key找不到文件中的属性时,要返回的默认值。
  • 返回值:String
    方法:getProperty(String name) 
    解释:通过指定的 ”name“ 即为 Key,搜索属性,没有返回默认值。
  • 无返回值:void
    方法:list(PrintStream out)
    解释:通过PrintStream 列出可读的属性列表
  • 无返回值:void
    方法:list(PrintWriter writer)
    解释:通过PrintStream 列出可写的属性列表
  • 无返回值:synchronized void
    方法:load(InputStream in)
    解释:从指定的 ”inputStream “ 即输出流,加载properties
  • 无返回值:synchronized void
    方法:loadFromXML(InputStream in)
    解释:从指定的 "InputStream" 即输出流,加载一个以XML形式的 Properties
  • 返回值:Enumeration<?>
    方法:propertyNames()
    解释:返回所有包含在文件里面的属性名称
  • 无返回值:void
    方法:save(OutputStream out, String comment)
    解释:注意,这种保存方法己经过时,Google 不推荐使用此种写法,这种方法忽略任何IO 异常,所以在实际操作过程中,可能会发生不必要的异常。
  • 返回值:object
    方法:setProperty(String name, String value)
    解释:设置属性,保存一个”键-值“对的属性。
  • 无返回值:synchronized void
    方法:store(OutputStream out, String comment)
    解释:通过 FileOutputStream 打开对应的程序文件,然后通过Store 保存之前 Properties 打包好的数据。这里备注可以为空。
  • 无返回值:void
    方法:storeToXML(OutputStream os, String comment)
    解释:通过FileOutputStream 打开对应的程序文件,将打包好的数据写入到XML文件。
  • 无返回值:synchronized void
    方法:storeToXML(OutputStream os, String comment, String encoding)
    解释:通过FileOutputStream 打开对应的程序文件,将打包好的数据写入到XML文件,第三个参数可以指定编码。
5、模拟用户设置参数
本篇还是以上篇例子为基础,还是以保存音乐播放状态来对Properties的使用进行大概的了解。本例中,实现了load方法,即加载用户之前保存的属性文件,然后通过获取对应的KEY值为状态赋值。此外还有一个save方法用来保存用户退出程序时的播放状态。
load方法代码如下:
本篇Load方法代码参考

 void load() 
    {
        Properties properties=new Properties();
        try {
            FileInputStream stream =this.openFileInput("music.cfg");
            properties.load(stream);
        } catch (FileNotFoundException e) {
            // TODO: handle exception
            return;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return;
        }
        isplay=Boolean.valueOf(properties.get("isplay").toString());
    }

注意:
  • 1、 properties.load方法如果遇到错误将抛出 IOException 异常,并且使用的编码为:ISO8859 - 1
  • 2、加载的数据出现空格将会被忽略。
  • 3、不要在你的Files 文件中加注释 ,因为load的时候将会忽略你的注释符号。
  • 4、公认的转义序列:“\”,“\ \”,“\ r”开始,“\ ñ”,“\!”,“\#”,“\ t”的,“\ b”与“\ f”的,和“\ uXXXX”(Unicode字符)。
save方法代码参考:
Save 方法代码参考

 boolean save()
    {
        Properties properties =new Properties(); 
        properties.put("isplay", String.valueOf(isplay));
        try {
            FileOutputStream stream=this.openFileOutput("music.cfg", Context.MODE_WORLD_WRITEABLE);
            properties.store(stream, "");
        } catch (FileNotFoundException e) {
            // TODO: handle exception
            return false;
        }catch (IOException e) {
            // TODO: handle exception
            return false;
        }
        return true;
        
    }

注意:
  • 1、 properties.store方法如果出现错误将会抛出IOException异常。
  • 2、properties 的KEY和value必须为 String 类型,如果不是String 类型将会抛出ClassCastException异常,请注意这点。
本篇全部代码参考如下:
Files 文件操作代码参考

package com.terry;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class sharedPreActivity extends Activity {
    private TextView myTextView;
    private CheckBox myBox;
    private playMusic PLAYER=null;
    private boolean isplay=false;

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myTextView=(TextView)findViewById(R.id.TextView01);
        
        myBox=(CheckBox)findViewById(R.id.CheckBox01);
        PLAYER=new playMusic(this); 
        /*
         * 文件创建模式:Activity.MODE_APPEND
         * 如果该文件已经存在,然后将数据写入,而不是抹掉它现有文件的末尾。
         */ 
        /*
         * 文件创建模式:MODE_PRIVATE
         * 默认模式,在那里创建的文件只能由应用程序调用,即为私有的
         */ 
        /*
         * 文件创建模式:Activity.MODE_WORLD_READABLE
         * 允许所有其他应用程序有读取和创建文件的权限。
         */
        /*
         * 文件创建模式:Activity.MODE_WORLD_WRITEABLE
         * 允许所有其他应用程序具有写入、访问和创建的文件权限。
         */
        
        /*
         * SharedPreferences---数据存储之获取
        SharedPreferences settings=getPreferences(Activity.MODE_PRIVATE);
        
        isplay=settings.getBoolean("isplay", false); //通过key值找到value,如果不存在即返回false
        
        */
        load();
        myBox.setChecked(isplay);
        if(isplay){
            
            myTextView.setText("当前音乐的播放状态:开");
            isplay=true;
            PLAYER.Play();
        }
        else{
            myTextView.setText("当前音乐的播放状态:关");
        }
       
        myBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if(isChecked)
                {
                    myTextView.setText("当前音乐的播放状态:开");
                    isplay=true;
                    PLAYER.Play();
                }
                else{
                    myTextView.setText("当前音乐的播放状态:关");
                    isplay=false;
                    PLAYER.FreeMusc();
                }
            }
        });
        
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if(keyCode==KeyEvent.KEYCODE_BACK){
            /*
             * SharedPreferences  --数据存储之保存
            SharedPreferences uiState=getPreferences(0);
            SharedPreferences.Editor editor=uiState.edit();
            editor.putBoolean("isplay", isplay);
            editor.commit(); 
            */
            save();
            if(isplay)
            {
                PLAYER.FreeMusc();
            }
            this.finish();
            return true;
        }
            
        return super.onKeyDown(keyCode, event);
    }
    
    
    void load() 
    {
        Properties properties=new Properties();
        try {
            FileInputStream stream =this.openFileInput("music.cfg");
            properties.load(stream);
        } catch (FileNotFoundException e) {
            // TODO: handle exception
            return;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return;
        }
        isplay=Boolean.valueOf(properties.get("isplay").toString());
    }
    
    boolean save()
    {
        Properties properties =new Properties(); 
        properties.put("isplay", String.valueOf(isplay));
        try {
            FileOutputStream stream=this.openFileOutput("music.cfg", Context.MODE_WORLD_WRITEABLE);
            properties.store(stream, "");
        } catch (FileNotFoundException e) {
            // TODO: handle exception
            return false;
        }catch (IOException e) {
            // TODO: handle exception
            return false;
        }
        return true;
        
    }
    
}

6、查看 Files 产生的文件
上篇preferences 存储数据时,文件保存在shared_prefs文件夹下,如果我们在 Files产生文件的时候没有为其指定绝对路径,那么系统就会在 shared_prefs 相同的目录中产生一个名为files 的文件夹,里面就有我们写入的数据。如图:
运行效果如下:
Tip:如果你需要用一个文件来加载初始化程序 ,可以事先在目录下res/raw/tempFile中建立一个静态文件,这样就可以通过Resources.openRawResource(R.raw.文件名)来返回一个文件流,直读读取文件。
就到这里。
源码下载:/Files/TerryBlog/FilesDemo.rar
本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/336755,如需转载请自行联系原作者

Android 小项目之--数据存储【Files】(附源码)相关推荐

  1. Android 小项目之--数据存储【Network】(附源码)

    将数据保存发送到电子邮件中备份,首要前提应该先在模拟器中设置好电子邮件帐户,设置如下: 第一步,启动模拟器,打开"菜单",选择"电子邮件"项,填写相应帐号和密码 ...

  2. Java毕设项目在线答题系统计算机(附源码+系统+数据库+LW)

    Java毕设项目在线答题系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

  3. C++小游戏笔记——射击小行星(附源码)

    C++小游戏笔记--射击小行星(附源码) 游戏展示图 一.飞船 1.飞船的绘制 2.飞船的角度 二.小行星 1.小行星的绘制 2."凹凸不平"效果的形成 3.小行星的分裂 三.子弹 ...

  4. Java毕设项目便利店库存管理计算机(附源码+系统+数据库+LW)

    Java毕设项目便利店库存管理计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecl ...

  5. Java毕设项目信贷管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目信贷管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

  6. Java毕设项目电费管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目电费管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

  7. 微信小程序支付功能-服务器端实现(附源码)

    实现了小程序最新的V3版本支付功能, 包括:支付.支付通知.退款.退款通知. 服务器端使用java开发,springboot框架 源码链接在评论中 微信小程序支付功能-服务器端实现(附源码)_哔哩哔哩 ...

  8. springboot基于微信小程序的选课系统 毕业设计-附源码060000

    目 录 摘要 1 1 绪论 1 1.1研究背景 1 1.2开发意义 1 1.3系统开发技术的特色 1 1.4论文结构与章节安排 1 2选课系统小程序系统分析 3 2.1 可行性分析 3 2.2 系统流 ...

  9. java web 项目—活动管理系统说明(附源码)

    个人文章地址(附源码) web活动管理系统 前言 工具 主要模块 用户登陆 用户注册 系统管理 用户使用 文章地址(附源码) 前言 这是采用jsp设计的web活动管理系统,并引入了Layui进行界面美 ...

最新文章

  1. android位置传感器
  2. 各种字符串分拆处理函数.sql
  3. OpenCV C++ 10 - Invert Images
  4. TensorFlow——共享变量的使用方法
  5. 【转】Treeview 无限分类非递归终极解决方案
  6. linux命令行看直播网站,快速搭建linux下视频点播,直播网站。
  7. 【秒懂音视频开发】16_AAC解码实战
  8. EnvironmentPlugin 一款用来配置可动态切换App环境的Gradle插件
  9. 安信可A9G二次开发的准备工作
  10. html怎么插入word文档,word中怎样插入html代码?
  11. python为csv文件添加表头_csv大文件分割以及添加表头
  12. 刘宇凡:莫沉浮华,归于平凡
  13. 百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题
  14. CCF系列题解--2015年9月第二题 日期计算
  15. 北师大 外国教育史-6(新教育运动)
  16. 谷歌大数据的三驾马车
  17. Win11 快捷键一览(部分实用)
  18. 判断当前是否是缅甸语
  19. 存储心跳线作用_硬盘跳线有什么用 硬盘跳线的作用有哪些
  20. 数字信号处理:循环卷积快速计算技巧

热门文章

  1. Qt 字符串QString arg()用法总结
  2. 利用Frame Animation实现动画效果,代码正确,就是达不到变换效果
  3. [导入]网页色彩搭配技巧
  4. python3 文件相关操作
  5. HDFS查看文件的前几行-后几行-行数
  6. java上传图片http错误_上传图片出错
  7. html 手机访问优化,移动端首屏优化
  8. 互联网晚报 | 3月11日 星期五 |​ ​​商汤科技在深圳成立新公司,;微信支付电子小票上线...
  9. 2021年电竞营销行业半年度报告
  10. 拆解食饮新消费品牌的增长密码