Android4开发入门经典 之 第七部分(2):数据存储【私塾在线原创】

数据存储基本知识

Android系统提供了多种数据存储的方式,如下:
1:Shared Preferences:用来存储私有的、原始类型的、简单的数据,通常是Key-value对
2:Internal Storage:在设备内部存储器中存储数据
3:External Storage:在设备的扩展存储上保存数据,通常是SD卡
4:SQLite Databases:SQLite数据库
5:Network Connection:存储数据到网络服务器上

使用Shared Preferences

Shared Preferences是用来存储一些应用私有的、原始类型的、简单的数据的一个框架,保存的数据通常是Key-value对
要获得SharedPreferences对象,通常有两种方法:
1:getSharedPreferences():如果你想要使用多个preferences文件的话,可以通过传入一个识别的名称就可以获取到相应的SharedPreferences对象
2:getPreferences():如果一个preferences文件仅仅在当前的Activity中使用的话,你可以使用这个方法,无需要提供识别的名称。
使用SharedPreferences对象来获取数据非常简单,直接使用相应的getter方法即可
使用SharedPreferences对象来存储数据,大致有如下几步
1:调用edit()方法来得到SharedPreferences.Editor
2:调用相应的put方法值添加进去
3:调用commit来提交保存这些数据
向SharedPreferences对象写入数据

java代码:
SharedPreferences sp =getSharedPreferences("SP",Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("param1", "sp1");
editor.putInt("param2", 222);
editor.commit();
注意:所有的写入操作应该在一个Editor里面,也就是不要调用多次sp.edit()方法,每调用一次就会创建一个Editor
在获得SharedPreferences对象的时候,需要指定文件创建的模式:
1:MODE_PRIVATE:默认模式,文件只可以被调用该方法的应用程序访问
2:MODE_WORLD_READABLE:赋予所有的应用程序都可以读取该文件
3:MODE_WORLD_WRITEABLE:赋予所有的应用程序都可以写该文件
4:MODE_MULTI_PROCESS:SharedPreference的装载标记,设置它,文件将会在SharedPreference实例被装载到进程的时候检查是否被修改,主要用在一个应用有多个进程的情况。
从SharedPreferences对象读取数据

java代码:
SharedPreferences sp = T2.this.getSharedPreferences("SP",Activity.MODE_PRIVATE);
String p1 = sp.getString("param1","");
int p2 = sp.getInt("param2",0);
SharedPreferences的数据以xml存储在data/data/包名/shared_prefs下面

Internal Storage

当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数据,只有这个应用程序才有对这个文件夹的写入权限,这个私有的文件夹位于Android系统的/data/data/目录下,其他的应用程序都无法向这个文件夹中写入数据。
要读取应用自己的私有文件,就不能直接使用Java I/O的API了,需要使用Activity提供的方法:openFileInput或openFileOutput。
在使用openFileOutput方法的时候,需要指定打开的模式:
1:MODE_PRIVATE:默认模式,文件只可以被调用该方法的应用程序访问
2:MODE_APPEND:如果文件已存在就向该文件的末尾继续写入数据,而不是覆盖原来的数据。
3:MODE_WORLD_READABLE:赋予所有的应用程序对该文件读的权限。
4:MODE_WORLD_WRITEABLE:赋予所有的应用程序对该文件写的权限。
向应用对应的Internal Storage里面写入数据,这里以写对象来示例,如下:

java代码:
FileOutputStream fout = null;
ObjectOutputStream s = null;
try{
fout = HelloWorldActivity.this.openFileOutput("MyData.txt",Activity.MODE_PRIVATE);
s = new ObjectOutputStream(fout);
os.writeObject(list);
}catch(Exception err){err.printStackTrace();}
finally{
try {fout.close();}catch(IOException e1){e1.printStackTrace();}
try {os.close();} catch(IOException e){e.printStackTrace();}
}
不支持BufferedOutputStream
读取应用对应的Internal Storage里面的数据,这里以读取对象来示例,如下:

java代码:
FileInputStream fin = null;
ObjectInputStream s = null;
try{
fin = HelloWorldActivity.this.openFileInput("MyData.txt");
s = new ObjectInputStream(fin);
Toast.makeText(HelloWorldActivity.this, "read file="+os.readObject(), Toast.LENGTH_LONG).show();
}catch(Exception err){
err.printStackTrace();
}finally{
try{fin.close();}catch(IOException e1){e1.printStackTrace();}
try{os.close();}catch(IOException e){e.printStackTrace();}
}
同样不支持BufferedInputStream
Internal Storage-保存Cache文件
如果你希望保存一些Cache数据,你可以使用getCacheDir() 来打开文件,将会把数据存储到一个临时的Cache文件里面。
当设备的内部存储空间低的时候,Android系统可能会清除这些Cache文件,以回收存储空间,这也意味着,你不能在Cache文件里面存储需要持久化的数据。

Internal Storage-其它常用方法

在Context中其他常用的方法:
1:getFilesDir()
得到内部存储的文件系统的绝对路径
2:getDir()
在内部存储中创建目录,如果存在的话就打开这个目录
3:deleteFile()
删除文件
4:fileList()
返回当前应用存储的文件列表

External Storage(操作SD卡)

Android的I/O基本上和Java的I/O是一样的,只有一点点不同的地方,比如:
1:需要加入sdcard的操作权限
2:需要判断sd卡是否存在,存在才能操作
3:放在sdcard的文件是公共的,而放到自己应用目录里面的文件才是私有的
常用的功能
1:在AndroidManifest.xml添加sdcard读写操作权限
2:在AndroidManifest.xml添加能创建和删除sdcard文件的操作权限
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
3:判断SD卡是否插入
Environment.getExternalStorageState().equals(android.os.Enviroment.MEDIA_MOUNTED)
4:获得SD卡根目录
Android7及以下版本,使用:Environment.getExternalStorageDirectory()可以获得如下路径“/Android/data//files/”
Android8及以上版本,建议使用:Context的getExternalFilesDir(type)方法,type表示你想要访问什么样的子目录,比如Environment.DIRECTORY_MUSIC,如果访问根目录,就传入null。
从SD卡上读文件,基本就是Java里面I/O的操作,这里以读对象为例:

java代码:
public Object readFile(String filePathName) {
Object ret = null;
FileInputStream fins = null;
ObjectInputStream s = null;
try {
File file = new File(Environment.getExternalStorageDirectory() + filePathName);
fins = new FileInputStream(file);
s = new ObjectInputStream(fins);
ret = os.readObject();
} catch(Exception err){err.printStackTrace();}finally{
try {fins.close();}catch(IOException e){e.printStackTrace();}
try {os.close();}catch(IOException e){e.printStackTrace();}
}
return ret;
}
比较遗憾的是,目前加上BufferedInputStream就出错
向SD卡上写文件,基本就是Java里面I/O的操作,这里以写对象为例:

java代码:
public void writefile(String filePathName,Object obj){
FileOutputStream fouts = null;
ObjectOutputStream s = null;
try {
File file = new File(Environment.getExternalStorageDirectory() +filePathName);
if(file.getParentFile().isDirectory() && !file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
if(!file.exists()){ file.createNewFile(); }
fouts = new FileOutputStream(file);
s = new ObjectOutputStream(fouts);
os.writeObject(obj);
} catch (Exception err) {err.printStackTrace();
}finally{
try {fouts.close();}catch(IOException e){e.printStackTrace();}
try {os.close();}catch(IOException e){e.printStackTrace();}
}
}
如果要保存成Cache文件,可以使用Context的getExternalCacheDir方法
 

视频配套PPT,视频地址【  Android4开发入门经典独家视频课程

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26715458/viewspace-717431/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26715458/viewspace-717431/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值