上次写了一下Android开发后台service的一些基本探索。今天来说一下数据的存储,由于手机自带的存储空间有限,所以选择用手机的SD卡来存储数据文件,想要将本地的文件导入SD卡或者将SD上的文件导出到本地硬盘,可以用Android SDK 提供的工具,从sdcard中去读文件,首先要把文件通过\android-sdk-windows\tools\adb.exe把本地计算机上的文件copy到sdcard上去,命令是:adb.exe push e:/Y.txt/sdcard/。要把仿真器上的文件copy到本地计算机上用命令: adb.exe pull ./sdcard/FileSDTest.txt d:/。
Service产生的数据文件用二进制(字节流)进行读写,这样做的好处是当文件读入内存后,既可以快速定位到目标数据在内存中的位置,也减少了文件数据占用的内存空间。文件中数据结构的设计思路是一段数据中有用户和时间信息、Service采集到的GPS信息以及用户添加的多媒体信息。其中有这样几个字段:数据段总长度(按字节)、用户信息长度(按字节)、用户和日期数据(用户信息)、GPS经纬度数据、多媒体数据长度(按字节)、多媒体文件格式以及多媒体文件数据。可以用下面这个结构来描述:
$总长度(4Byte)$|用户信息长度(4byte)|用户信息(xByte)$|GPS数据(8Byte+8Byte+8Byte)$|多媒体数据长度(4Byte)|类型(4Byte)|数据(Sizeof(多媒体)Byte)|多媒体....
$总长度(4Byte)$|用户信息长度(4byte)|用户信息(xByte)$|GPS数据(8Byte+8Byte+8Byte)$|多媒体数据长度(4Byte)|类型(4Byte)|数据(Sizeof(多媒体)Byte)|多媒体....
$总长度(4Byte)$|用户信息长度(4byte)|用户信息(xByte)$|GPS数据(8Byte+8Byte+8Byte)$|多媒体数据长度(4Byte)|类型(4Byte)|数据(Sizeof(多媒体)Byte)|多媒体....
用这种格式按字节流写入文件后,当其他程序将文件按字节流读取到内存中的buffer[]后,就可以找到每一种数据精确的记录位置。举个例子,找第一段记录中的数据时,先将buffer[4..7]中的二进制数据转为userlength(int),就可以知道用户信息的长度了,这样buffer[8..(8+userlength)]中记录的就是用户名和日期,接着buffer[(8+userlength)..(32+userlength)]中24个字节记录了记录产生时终端采集到的GPS信息的经度(lon)、纬度(lat)和高度(alt),三条数据(double)中每条数据占8个字节。在buffer[(32+userlength)..(36+userlength)]中记录了第一条多媒体信息的长度medialength(int),buffer[(36+userlength)..(40+userlength)]中是这个多媒体文件的格式信息,buffer[(40+userlength)...(40+userlength+medialength)]中记录的是多媒体文件数据,依次类推可以找出后面的多媒体数据。如果要找第二段记录信息,首先读取buffer[0..3],转成int的sumlength型后定位到buffer[sumlength],这就是第二段信息的起始位置,再依次进行上述操作就可以取到全部数据。