处理数据的方法和装置.pdf

上传人:柴****2 文档编号:4755087 上传时间:2018-11-07 格式:PDF 页数:19 大小:540.80KB
返回 下载 相关 举报
摘要
申请专利号:

CN201110382450.8

申请日:

2011.11.25

公开号:

CN103136234A

公开日:

2013.06.05

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 17/30申请日:20111125|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

腾讯科技(深圳)有限公司

发明人:

李飞云

地址:

518000 广东省深圳市福田区赛格科技园2栋东403室

优先权:

专利代理机构:

北京三高永信知识产权代理有限责任公司 11138

代理人:

王希刚

PDF下载: PDF下载
内容摘要

本发明公开了一种处理数据的方法和装置,属于通信技术领域。所述方法包括:当终端需要在本地预设程序的第一文件中写入数据时,为所述需要写入的数据创建临时文件,其中所述需要写入的数据包括至少一个数据块;对所述数据块进行序列化处理,并将所述序列化的数据块存储到所述临时文件中;在存储所述序列化的数据块后,用所述临时文件替换所述第一文件。本发明采用异步写入数据的方法,在数据写入过程中不阻塞用户界面操作,能够预防数据格式错误或数据不完整而影响应用的使用,提高程序容错性和稳定性。

权利要求书

权利要求书一种处理数据的方法,其特征在于,所述方法包括:
当终端需要在预设程序的第一文件中写入数据时,为所述需要写入的数据创建临时文件,其中所述需要写入的数据包括至少一个数据块;
对所述数据块进行序列化处理,并将所述序列化的数据块存储到所述临时文件中;
在存储所述序列化的数据块后,用所述临时文件替换所述第一文件。
根据权利要求1所述的方法,其特征在于,所述对所述数据块进行序列化处理之前,还包括:
为所述需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和成功标志位。
根据权利要求2所述的方法,其特征在于,所述方法还包括:
当所述终端需要读取所述预设程序的第一文件中的数据时,从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息;
根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据;
如果判断结果为是,则读取所述需要读取的数据。
根据权利要求3所述的方法,其特征在于,所述根据所述需要读取的数据的头部信息和所述需要读取的数据的版本信息,判断是否能够继续读取所述需要读取的数据,包括:
检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本信息一致;
如果所述成功标志位是成功读取的标志,且所述头部信息中的版本信息与所述终端获取到的第一文件的版本信息一致,则确定能够读取所述需要读取的数据。
根据权利要求4所述的方法,其特征在于,所述方法还包括:
如果所述终端判断不能够读取所述需要读取的数据,则删除所述需要读取的数据所在的第一文件。
根据权利要求3‑5任一项所述的方法,其特征在于,所述读取所述需要读取的数据,包括:
所述需要读取的数据包括至少一个数据块,对所述数据块执行反序列化处理,以获得所述需要读取的数据。
根据权利要求3所述的方法,其特征在于,所述方法还包括:
在读取所述需要读取的数据之前,将所述成功标志位修改为未成功读取的标志;
在成功读取所述需要读取的数据后,将所述成功标志位修改为成功读取的标志。
一种处理数据的装置,其特征在于,所述装置包括:
创建模块,用于当需要在预设程序的第一文件中写入数据时,为所述需要写入的数据创建临时文件,其中所述需要写入的数据包括至少一个数据块;
序列化模块,用于对所述数据块进行序列化处理,并将所述序列化的数据块存储到所述创建模块创建的临时文件中;
替换模块,用于在所述序列化模块存储所述序列化的数据块后,用所述临时文件替换所述第一文件。
根据权利要求8所述的装置,其特征在于,所述装置还包括:
添加模块,用于所述序列化模块对所述数据块进行序列化处理之前,为所述需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和成功标志位。
根据权利要求9所述的装置,其特征在于,所述装置还包括:
获取模块,用于当需要读取所述预设程序的第一文件中的数据时,从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息;
判断模块,用于根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据;
读取模块,用于如果判断模块的判断结果为是,则读取所述需要读取的数据。
根据权利要求10所述的装置,其特征在于,所述判断模块具体用于:
检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本信息一致;
如果所述成功标志位是成功读取的标志,且所述头部信息中的版本信息与所述终端获取到的所述第一文件的版本信息一致,则确定能够读取所述需要读取的数据。
根据权利要求11所述的装置,其特征在于,所述装置还包括:
删除模块,用于如果所述判断模块判断出不能够读取所述需要读取的数据,则删除所述需要读取的数据所在的第一文件。
根据权利要求10‑12任一项所述的装置,其特征在于,所述读取模块具体用于:
所述需要读取的数据包括至少一个数据块,对所述数据块执行反序列化处理,以获得所述需要读取的数据。
根据权利要求10所述的装置,其特征在于,所述装置还包括:
第一修改模块,用于在读取模块读取所述需要读取的数据之前,将所述成功标志位修改为未成功读取的标志;
第二修改模块,用于在成功读取所述需要读取的数据后,将所述成功标志位修改为成功读取的标志。

说明书

说明书处理数据的方法和装置
技术领域
本发明涉及通信技术领域,特别涉及一种处理数据的方法和装置。
背景技术
应用程序开发过程中,经常需要存储数据到文件和读取数据,而在数据存储和读取的同时有下面两个重要的方面需要考虑:第一、在存储和读取数据时不能阻塞界面用户操作,不能影响用于界面交互的流畅性;第二、数据的容错性和可升级性,不能因为数据的读写异常而导致整个程序的崩溃,不能因为上次保存的数据有错或者不完整而导致下次启动程序时读入数据出错导致程序启动不起来。
现有技术中,采用直接文件存储方式来进行数据存储。直接文件存储就是直接把数据序列化后写入原文件,在读取写入的数据时,先把数据读入然后反序列化,得到用户需要的数据。序列化是将对象状态转换为可保持或传输的格式的过程,与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:在数据量比较大的时候,直接写入大块数据,磁盘IO(Input/Output,输入/输出)运行比较慢,会阻塞UI(User Interface,用户界面)交互,写入数据过程中程序异常退出,下次读取数据时数据不完整,可能会导致程序无法启动。
发明内容
为了解决在数据写入时出现的问题,本发明实施例提供了一种处理数据的方法和装置。所述技术方案如下:
一方面,提供了一种处理数据的方法,所述方法包括:
当终端需要在预设程序的第一文件中写入数据时,为所述需要写入的数据创建临时文件,其中所述需要写入的数据包括至少一个数据块;
对所述数据块进行序列化处理,并将所述序列化的数据块存储到所述临时文件中;
在存储所述序列化的数据块后,用所述临时文件替换所述第一文件。
所述对所述数据块进行序列化处理之前,还包括:
为所述需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和成功标志位。
所述方法还包括:
当所述终端需要读取所述预设程序的第一文件中的数据时,从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息;
根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据;
如果是,则读取所述需要读取的数据。
所述根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够继续读取所述需要读取的数据,包括:
检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本信息一致;
如果所述成功标志位是成功读取的标志,且所述头部信息中的版本信息与所述终端获取到的所述第一文件的版本信息一致,则确定能够读取所述需要读取的数据。
所述方法还包括:
如果所述终端判断出不能够读取所述需要读取的数据,则删除所述需要读取的数据所在的第一文件。
所述读取所述需要读取的数据,包括:
所述需要读取的数据包括至少一个数据块,对所述数据块执行反序列化处理,以获得所述需要读取的数据。
所述方法还包括:
在读取所述需要读取的数据之前,将所述成功标志位修改为未成功读取的标志;
在成功读取所述需要读取的数据后,将所述成功标志位修改为成功读取的标志。
另一方面,还提供了一种处理数据的装置,所述装置包括:
创建模块,用于当需要在预设程序的第一文件中写入数据时,为所述需要写入的数据创建临时文件,其中所述需要写入的数据包括至少一个数据块;
序列化模块,用于对所述数据块进行序列化处理,并将所述序列化的数据块存储到所述创建模块创建的临时文件中;
替换模块,用于在所述序列化模块存储所述序列化的数据块后,用所述临时文件替换所述第一文件。
所述装置还包括:
添加模块,用于所述序列化模块对所述数据块进行序列化处理之前,为所述需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和成功标志位。
所述装置还包括:
获取模块,用于当需要读取所述预设程序的第一文件中的数据时,从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息;
判断模块,用于根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据;
读取模块,用于如果判断模块的判断结果为是,则读取所述需要读取的数据。
所述判断模块具体用于:
检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本信息一致;
如果所述成功标志位是成功读取的标志,且所述头部信息中的版本信息与所述终端获取到的所述第一文件的版本信息一致,则确定能够读取所述需要读取的数据。
所述装置还包括:
删除模块,用于如果所述判断模块判断出不能够读取所述需要读取的数据,则删除所述需要读取的数据所在的第一文件。
所述读取模块具体用于:
所述需要读取的数据包括至少一个数据块,对所述数据块执行反序列化处理,以获得所述需要读取的数据。
所述装置还包括:
第一修改模块,用于在读取模块读取所述需要读取的数据之前,将所述成功标志位修改为未成功读取的标志;
第二修改模块,用于在成功读取所述需要读取的数据后,将所述成功标志位修改为成功读取的标志。
本发明实施例提供的技术方案带来的有益效果是:采用异步写入数据的方法,在数据写入过程中不阻塞用户界面操作,能够预防数据格式错误或数据不完整而影响程序的使用,提高程序容错性和稳定性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例1中提供的一种处理数据的方法的流程;
图2是本发明实施例2中提供的一种处理数据的方法的流程;
图3是本发明实施例3中提供的一种处理数据的方法的流程;
图4是本发明实施例3中提供的一种处理数据的方法的流程;
图5是本发明实施例4中提供的一种处理数据的装置的示意图;
图6是本发明实施例4中提供的另一种处理数据的装置的示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
参见图1,本发明实施例提供了一种处理数据的方法,包括:
101:当终端需要在预设程序的第一文件中写入数据时,为所述需要写入的数据创建临时文件,其中所述需要写入的数据包括至少一个数据块;
102:对所述数据块进行序列化处理,并将所述序列化的数据块存储到所述临时文件中;
103:在存储所述序列化的数据块后,用所述临时文件替换所述第一文件。
本实施例中,所述对所述数据块进行序列化处理之前,还包括:
为所述需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和成功标志位。
进一步地,本实施例中,所述方法还包括:
当所述终端需要读取所述预设程序的第一文件中的数据时,从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息;
根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据;
如果是,则读取所述需要读取的数据。
其中,所述根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据,包括:
检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本信息一致;
如果所述成功标志位是成功读取的标志,且所述头部信息中的版本信息与所述终端获取到的第一文件的版本信息一致,则确定能够读取所述需要读取的数据。
本实施例中,所述方法还包括:
如果所述终端判断出不能够读取所述需要读取的数据,则删除所述需要读取的数据所在的第一文件。
其中,所述读取所述需要读取的数据,包括:
所述需要读取的数据包括至少一个数据块,对所述数据块执行反序列化处理,以获得所述需要读取的数据。
优选地,本实施例中,所述方法还包括:
在读取所述需要读取的数据之前,将所述成功标志位修改为未成功读取的标志;
在成功读取所述需要读取的数据后,将所述成功标志位修改为成功读取的标志。
本发明提供的方法实施例的有益效果是:采用异步写入数据的方法,在数据写入过程中不阻塞用户界面操作,能够预防数据格式错误或数据不完整而影响应用的使用,提高程序容错性和稳定性。
实施例2
参见图2,本发明实施例提供了一种处理数据的方法,为了在读写文件不阻塞UI线程,使用Symbian平台RFile的异步读写接口,void Read(TInt aPos,TDes8&aDes,TInt aLength,TRequestStatus&aStatus)const;voidWrite(const TDesC8&aDes,TRequestStatus&aStatus);和活动对象CActive,每次读写一块数据,并尽量减少读写文件次数,该方法包括:
201:终端获取需要在本地预设程序的第一文件中写入的数据。
本实施例中,终端包括:手机、手持设备等,对此本实施例不做具体限定。预设程序指需要写入数据的程序,并可以提供给用户读取数据的程序,如开心网、QQ等。第一文件是指预设程序指定的存储下载信息的文件。
本实施例中,终端启动预设程序后,在该程序的运行过程中,需要在互联网上下载大数量的数据,一般超过10M,终端需要将获取到的数据存储到该程序中。如,用户登录某一网站,并在该网站上预订了关于某个事件的消息,如果终端检测到有关于该事件的消息,则会将该消息下载到终端上,再将该消息进行异步存储。其中,终端上需要写入的数据一般比较大,包括至少一个数据块。
202:终端为需要写入的数据创建临时文件。
本实施例中,为了保证写入数据异常后不会影响旧的数据,保持下次读取数据的完整性,当终端需要在本地预设程序的第一文件中写入数据时,先创建一个临时文件,在对需要写入的数据处理完毕后,将处理完的数据存储到临时文件中,这样如果在数据处理过程中出现异常,也不会因为异常而影响到原文件。
203:终端为需要写入的数据添加头部信息。
本实施例中,为保证读取的数据和写入的数据保持一致,可以为需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和写入文件的次数等。在读取数据时,就可以根据头部信息,获得与写入数据一致的数据,不会因为数据不一致而导致读取错误。如,写入文件的长度是10个数据块,则将该文件的长度写入到头部信息中,在读取该文件的时候,就可以根据该文件的长度对该文件进行判断。因此保存数据时需要加入额外数据如写入文件的次数,和每次写入文件的数据长度,以保证读取数据时和写入数据保持一致。本实施例中,在头部信息中还可以预留成功标志位,成功标志位用于标识上次读取第一文件时是否成功。其中在第一文件写入过程中,默认该成功标志位为成功读取的标志位。
本步骤为可选步骤,具体实现过程中也可以不执行本步骤,直接执行步骤204。
204:终端对每个数据块进行序列化处理。
本实施例中,终端获取到需要写入的数据后,可以先把内存中格式化的数据通过RWriteStream序列化为可存储的二进制数据,然后异步写入文件,读取数据时,先异步读取数据,然后通过RReadStream反序列化为内存结构化数据。这两个过程需要始终保持一致,包括写入文件大小和读取文件大小,序列化和反序列化函数。
205:判断上述数据块的序列化是否成功,如果是,则执行步骤206,否则停止写入。
本实施例中,在对数据进行序列化后,判断序列化是否成功,因为由于异常原因,可能影响数据的序列化,导致序列化失败,如手机电池电量不足自动关机,或是用户退出该程序。如果发现序列化失败,则停止写入数据,写入失败,这样也保证了原文件不会受到损伤。
206:将序列化成功后的数据块存储到临时文件中。
本实施例中,写入数据时先把数据写入到一个临时文件,等写入成功后再删除原文件,改名临时文件为原文件名。可以保证写入数据异常后不会影响旧的数据,保持下次读取数据的完整性。
207:判断存储序列化后的数据是否成功,如果是,则执行步骤208,否则停止写入。
本实施例中,在存储序列化的数据的过程中,同步骤203一样,由于异常原因可能导致存储失败,如手机电池电量不足自动关机,或是用户退出该程序。如果发现存储失败,则停止写入数据,写入失败,这样也保证了原文件不会受到损伤。
208:判断是否将所有需要写入的数据块都处理完毕,如果是,则执行步骤207,否则,执行步骤202。
本实施例中,进一步地,提供同步写入操作,在程序退出时如果异步写入数据还没完成,则切换到同步写入操作,即返回步骤202,直到完成写入程序才退出。如果所有的数据块都处理完毕,则执行步骤207。
本实施例中,同步相对于异步写文件,异步写文件是调用写入函数后,会立即返回,后台系统文件服务继续执行写入操作。而同步写入时,调用写入函数后,会一直等待系统文件服务写入操作完成后才返回。
209:用临时文件替换第一文件。
本实施例中,写入数据时先把数据写入到一个临时文件,等写入成功后再删除原文件,将临时文件的名称修改为第一文件的名称,即用临时文件替换第一文件,这样可以保证写入数据异常后不会影响旧的数据,保持下次读取数据的完整性。
其中,步骤203‑209具体执行的是:对数据块进行序列化处理,并将所述序列化的数据块存储到所述临时文件中;在存储所述序列化的数据块后,用所述临时文件替换所述第一文件的步骤。
本实施例中,在具体实现时,封装步骤201‑207的逻辑操作到类CDataFileStore中,并对外提供简单接口,如:
IMPORT_C void StartWrite(MDataFileStoreObserver*aObserver);
IMPORT_C void StartRead(MDataFileStoreObserver*aObserver);
IMPORT_C void SynWrite(MDataFileStoreObserver*aObserver);
在读写数据时,定义接口作为回调,需要外部实现,完成数据的序列化和反序列化操作和读写数据完成和失败的通知。
本发明提供的方法实施例的有益效果是:采用异步写入数据的方法,在数据写入过程中不阻塞用户界面操作,能够预防数据格式错误或数据不完整而影响应用的使用,提高程序容错性和稳定性。并封装基本逻辑操作,对外提供简单接口,减少后续代码开发量。
实施例3
参见图3,本发明实施例提供了一种处理数据的方法,本实施例提供的处理数据的方法是同实施例2提供的处理数据的方法相对应的,同实施例2一样,为了在读写文件不阻塞UI线程,可以使用Symbian平台RFile的异步读写接口,void Read(TInt aPos,TDes8&aDes,TInt aLength,TRequestStatus&aStatus)const;voidWrite(const TDesC8&aDes,TRequestStatus&aStatus);和活动对象CActive,每次读写一块数据,并尽量减少读写文件次数,该方法包括:
301:终端启动预设程序后,获取需要读取的数据的头部信息和第一文件的版本信息。
本实施例中,在实施例2中写入数据时,在数据中添加了头部信息,当所述终端需要读取所述预设程序的第一文件中的数据时,从所述第一文件中检查所述需要读取的数据的头部信息,头部信息中包括数据的版本信息、成功标志位和数据的长度等。
本实施例中,终端启动预设程序后,获取第一文件的版本信息,该版本信息是终端启动预设程序后获取到的,第一文件的版本信息与头部信息中包括的版本信息的具体内容可能一样,也可能不同。
302:根据所述需要读取的数据的头部信息和第一文件的版本信息,判断是否能够读取所述需要读取的数据,如果是,则执行步骤303,否则,停止读取数据,并删除数据文件。
本实施例中,在文件开始处加入头部信息,保存读取是否成功标识,数据格式版本等信息。读取是否成功标志在每次读取数据开始时会写入该信息为false,读取成功后再写入true,如果读取过程由于文件不完整或格式有错导致程序退出,下次读取时检查该标志,可以提前结束读取数据,保护下次读取数据不会导致程序退出。每次读取数据时先检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的第一文件的版本信息一致,成功标志位为成功读取标志,且头部信息中的版本信息和第一文件的版本信息一致则继续读取需要读取的数据。
本实施例中,如果判断出所述终端不能够继续读取所述需要读取的数据,即成功标志位位未成功读取的标志或是版本信息不一样,则停止读取所述需要读取的数据,并删除所述需要读取的数据所在的文件。
本步骤具体执行的是:根据所述需要读取的数据的头部信息和第一文件的版本信息,判断是否能够继续读取所述需要读取的数据。
303:重置读取成功标志位。
本实施例中,如果读取成功标志位成功,则将读取成功标志位重置,如将成功标志位置为“0”,等待本次读取成功后,再将该标志位修改为“1”,如果本次读取失败,则不再修改该成功标志位,本次读取数据失败,则读取成功标志位为“0”。
304:读取数据。
参见图4,本实施例中,需要读取的数据包括至少一个数据块,读取数据具体包括以下步骤305‑307:
305:根据所述需要读取的数据的头部信息,判断读取到的数据块是否是需要读取数据的最后一个数据块,如果是,则将成功标志位修改为成功读取的标志,否则执行步骤306。
本实施例中,由于在写入数据时,在数据中写入了头部信息,包括写入文件的数据长度,如写入了文件的数据长度为10个文件块,则在读取该写入文件的时候,读出该文件的长度为10个文件块,但实际过程中,只读取了8个文件块,其余的两个文件块可能被破坏了,在这种情况下,终端判断出还存在两个未读取的数据,则需要对这个文件进行修复。如果实际读取过程中,读到了10个文件块,则与头部信息写入的文件长度一致,则说明已读取完整个文件,将该文件的头部信息中的成功标志位修改为成功读取的标志。其中,可以用“1”表示读取成功,本实施例对此不做具体限定。
306;对读取到的数据块进行反序列化处理,以获得需要读取的数据。
本实施例中,为保证能够正确读取数据,反序列化函数和实施例2中的序列化函数是相对应的。
307:判断对数据块进行的反序列化处理是否成功,如果是,则执行步骤305,否则停止读取。
本实施例中,在得到反序列化数据后,解析反序列化数据,判断得到的数据是否正确,如果正确,则返回步骤305继续执行,依次读取所有的数据块,直到所有的数据块都读取完毕,否则,读取失败,停止读取数据。
步骤301‑307具体执行的是:当所述终端需要读取所述预设程序的第一文件中的数据时,从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息;根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据;如果是,则读取所述需要读取的数据的步骤。
本实施例中,在具体实现时,封装步骤301‑307的逻辑操作到类CDataFileStore中,并对外提供简单接口,如:
IMPORT_C void StartWrite(MDataFileStoreObserver*aObserver);
IMPORT_C void StartRead(MDataFileStoreObserver*aObserver);
IMPORT_C void SynWrite(MDataFileStoreObserver*aObserver);
在读写数据时,定义接口作为回调,需要外部实现,完成数据的序列化和反序列化操作和读写数据完成和失败的通知。
本发明提供的方法实施例的有益效果是:采用异步读取的方法,在数据读取过程中不阻塞用户界面操作,能够预防数据格式错误或数据不完整而影响应用的使用,提高程序容错性和稳定性。并封装基本逻辑操作,对外提供简单接口,减少后续代码开发量。
实施例4
参见图5,本发明实施例提供了一种处理数据的装置,该装置包括:创建模块401、序列化模块402和替换模块403。
创建模块401,用于当需要在预设程序的第一文件中写入数据时,为所述需要写入的数据创建临时文件,其中所述需要写入的数据包括至少一个数据块。
本实施例中的装置可以对应实施例2和实施例3中的终端,终端包括:手机、手持设备等,对此本实施例不做具体限定。预设程序指需要写入数据的程序,并可以提供给用户读取数据的程序,如开心网、QQ等。第一文件是指预设程序指定的存储下载信息的文件。
本实施例中,终端启动预设程序后,在该程序的运行过程中,需要在互联网上下载大数量的数据,一般超过10M,终端需要将获取到的数据存储到该程序中。如,用户登录某一网站,并在该网站上预订了关于某个事件的消息,如果终端检测到有关于该事件的消息,则会将该消息下载到终端上,再将该消息进行异步存储。其中,终端上需要写入的数据一般比较大,包括至少一个数据块。
本实施例中,为了保证写入数据异常后不会影响旧的数据,保持下次读取数据的完整性,当终端需要在本地预设程序的第一文件中写入数据时,通过创建模块401先创建一个临时文件,在对需要写入的数据处理完毕后,将处理完的数据存储到临时文件中,这样如果在数据处理过程中出现异常,也不会因为异常而影响到原文件。
参见图6,进一步地,可选地所述装置还包括:
添加模块404,用于所述序列化模块对所述数据块进行序列化处理之前,为所述需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和成功标志位。
本实施例中,为保证读取的数据和写入的数据保持一致,添加模块404可以为需要写入的数据添加头部信息,所述头部信息包括所述需要写入的数据的数据长度、版本信息和写入文件的次数等。在读取数据时,就可以根据头部信息,获得与写入数据一致的数据,不会因为数据不一致而导致读取错误。如,写入文件的长度是10个数据块,则将该文件的长度写入到头部信息中,在读取该文件的时候,就可以根据该文件的长度对该文件进行判断。因此保存数据时需要加入额外数据如写入文件的次数,和每次写入文件的数据长度,以保证读取数据时和写入数据保持一致。本实施例中,在头部信息中还可以预留成功标志位,成功标志位用于标识上次读取第一文件时是否成功。其中在第一文件写入过程中,默认该成功标志位为成功读取的标志位。
序列化模块402,用于对所述数据块进行序列化处理,并将所述序列化的数据块存储到所述创建模块创建的临时文件中。
本实施例中,终端获取到需要写入的数据后,序列化模块402可以先把内存中格式化的数据通过RWriteStream序列化为可存储的二进制数据,然后异步写入文件,读取数据时,先异步读取数据,然后通过RReadStream反序列化为内存结构化数据。这两个过程需要始终保持一致,包括写入文件大小和读取文件大小,序列化和反序列化函数。
本实施例中,序列化模块402在对数据进行序列化后,判断序列化是否成功,因为由于异常原因,可能影响数据的序列化,导致序列化失败,如手机电池电量不足自动关机,或是用户退出该程序。如果发现序列化失败,则停止写入数据,写入失败,这样也保证了原文件不会受到损伤。
本实施例中,序列化模块402写入数据时先把数据写入到一个临时文件,等写入成功后再删除原文件,改名临时文件为原文件名。可以保证写入数据异常后不会影响旧的数据,保持下次读取数据的完整性。
本实施例中,序列化模块402在存储序列化的数据的过程中,也可能由于异常原因可能导致存储失败,如手机电池电量不足自动关机,或是用户退出该程序。如果发现存储失败,则停止写入数据,写入失败,这样也保证了原文件不会受到损伤。
本实施例中,进一步地,提供同步写入操作,在程序退出时如果异步写入数据还没完成,则切换到同步写入操作,直到完成写入程序才退出。如果所有的数据块都处理完毕,则替换模块403执行操作。
替换模块403,用于在所述序列化模块存储所述序列化的数据块后,用所述临时文件替换所述第一文件。
本实施例中,序列化模块402写入数据时先把数据写入到一个临时文件,等写入成功后替换模块403再删除原文件,将临时文件的名称修改为第一文件的名称,即用临时文件替换第一文件,这样可以保证写入数据异常后不会影响旧的数据,保持下次读取数据的完整性。
参见图6,进一步地,所述装置还包括:获取模块405、判断模块406和读取模块407。
获取模块405,用于当需要读取所述预设程序的第一文件中的数据时,从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息。
本实施例中,添加模块404在数据中添加了头部信息,当所述终端需要读取所述预设程序的第一文件中的数据时,获取模块405从所述第一文件中检查所述需要读取的数据的头部信息,头部信息中包括数据的版本信息、成功标志位和数据的长度等。
本实施例中,终端启动预设程序后,获取模块405获取第一文件的版本信息,该版本信息是终端启动预设程序后获取到的,第一文件的版本信息与头部信息中包括的版本信息的具体内容可能一样,也可能不同。
判断模块406,用于根据所述需要读取的数据的头部信息和所述第一文件的版本信息,判断是否能够读取所述需要读取的数据。
其中,所述判断模块406具体用于:检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的第一文件的版本信息一致,如果所述成功标志位是成功读取的标志,且所述头部信息中的版本信息与所述终端获取到的第一文件的版本信息一致,则确定能够读取所述需要读取的数据。
本实施例中,添加模块404在文件开始处加入头部信息,保存读取是否成功标识,数据格式版本等信息。读取是否成功标志在每次读取数据开始时会写入该信息为false,读取成功后再写入true,如果读取过程由于文件不完整或格式有错导致程序退出,下次读取时检查该标志,可以提前结束读取数据,保护下次读取数据不会导致程序退出。判断模块406每次读取数据时先检查所述头部信息中的成功标志位和版本信息,判断所述成功标志位是否是成功读取的标志,且所述头部信息中的版本信息是否与所述终端获取到的第一文件的版本信息一致,成功标志位为成功读取标志,且头部信息中的版本信息和第一文件的版本信息一致则继续读取需要读取的数据。
参见图6,进一步地,本实施例中的装置还包括:
删除模块408,用于如果所述判断模块406判断出本地不能够读取所述需要读取的数据,则删除所述需要读取的数据所在的第一文件。
参见图6,进一步地,本实施例中的装置还包括:
第一修改模块409,用于在读取模块读取所述需要读取的数据之前,将所述成功标志位修改为未成功读取的标志;
第二修改模块410,用于在成功读取所述需要读取的数据后,将所述成功标志位修改为成功读取的标志。
本实施例中,如果读取成功标志位成功,则第一修改模块409将读取成功标志位重置,如将成功标志位置为“0”,等待本次读取成功后,第二修改模块410再将该标志位修改为“1”,如果本次读取失败,则第二修改模块410不再修改该成功标志位,本次读取数据失败,则读取成功标志位为“0”。
读取模块407,用于如果判断模块的判断结果为是,则读取所述需要读取的数据。
其中,读取模块具体用于:所述需要读取的数据包括至少一个数据块,对所述数据块执行反序列化处理,以获得所述需要读取的数据。
本实施例中,由于在写入数据时,添加模块404在数据中写入了头部信息,包括写入文件的数据长度,如写入了文件的数据长度为10个文件块,则在读取该写入文件的时候,读出该文件的长度为10个文件块,但实际过程中,只读取了8个文件块,其余的两个文件块可能被破坏了,在这种情况下,终端判断出还存在两个未读取的数据,则需要对这个文件进行修复。如果实际读取过程中,读到了10个文件块,则与头部信息写入的文件长度一致,则说明已读取完整个文件,第二修改模块410将该文件的头部信息中的成功标志位修改为成功读取的标志。其中,可以用“1”表示读取成功,本实施例对此不做具体限定。
本实施例中,为保证能够正确读取数据,反序列化函数和实施例2中的序列化函数是相对应的。
本实施例中,在得到反序列化数据后,解析反序列化数据,判断得到的数据是否正确,如果正确,则依次读取所有的数据块,直到所有的数据块都读取完毕,否则,读取失败,停止读取数据。
本发明实施例提供的技术方案带来的有益效果是:采用异步写入数据的方法,在数据写入过程中不阻塞用户界面操作,能够预防数据格式错误或数据不完整而影响程序的使用,提高程序容错性和稳定性。
本实施例提供的处理数据的装置,具体可以与相应地方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

处理数据的方法和装置.pdf_第1页
第1页 / 共19页
处理数据的方法和装置.pdf_第2页
第2页 / 共19页
处理数据的方法和装置.pdf_第3页
第3页 / 共19页
点击查看更多>>
资源描述

《处理数据的方法和装置.pdf》由会员分享,可在线阅读,更多相关《处理数据的方法和装置.pdf(19页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103136234 A (43)申请公布日 2013.06.05 CN 103136234 A *CN103136234A* (21)申请号 201110382450.8 (22)申请日 2011.11.25 G06F 17/30(2006.01) (71)申请人 腾讯科技 (深圳) 有限公司 地址 518000 广东省深圳市福田区赛格科技 园 2 栋东 403 室 (72)发明人 李飞云 (74)专利代理机构 北京三高永信知识产权代理 有限责任公司 11138 代理人 王希刚 (54) 发明名称 处理数据的方法和装置 (57) 摘要 本发明公开了一种处理数据的方法和。

2、装置, 属于通信技术领域。所述方法包括 : 当终端需要 在本地预设程序的第一文件中写入数据时, 为所 述需要写入的数据创建临时文件, 其中所述需要 写入的数据包括至少一个数据块 ; 对所述数据块 进行序列化处理, 并将所述序列化的数据块存储 到所述临时文件中 ; 在存储所述序列化的数据块 后, 用所述临时文件替换所述第一文件。 本发明采 用异步写入数据的方法, 在数据写入过程中不阻 塞用户界面操作, 能够预防数据格式错误或数据 不完整而影响应用的使用, 提高程序容错性和稳 定性。 (51)Int.Cl. 权利要求书 2 页 说明书 11 页 附图 5 页 (19)中华人民共和国国家知识产权局 。

3、(12)发明专利申请 权利要求书2页 说明书11页 附图5页 (10)申请公布号 CN 103136234 A CN 103136234 A *CN103136234A* 1/2 页 2 1. 一种处理数据的方法, 其特征在于, 所述方法包括 : 当终端需要在预设程序的第一文件中写入数据时, 为所述需要写入的数据创建临时文 件, 其中所述需要写入的数据包括至少一个数据块 ; 对所述数据块进行序列化处理, 并将所述序列化的数据块存储到所述临时文件中 ; 在存储所述序列化的数据块后, 用所述临时文件替换所述第一文件。 2. 根据权利要求 1 所述的方法, 其特征在于, 所述对所述数据块进行序列化处。

4、理之前, 还包括 : 为所述需要写入的数据添加头部信息, 所述头部信息包括所述需要写入的数据的数据 长度、 版本信息和成功标志位。 3. 根据权利要求 2 所述的方法, 其特征在于, 所述方法还包括 : 当所述终端需要读取所述预设程序的第一文件中的数据时, 从所述第一文件中获取所 述需要读取的数据的头部信息和所述第一文件的版本信息 ; 根据所述需要读取的数据的头部信息和所述第一文件的版本信息, 判断是否能够读取 所述需要读取的数据 ; 如果判断结果为是, 则读取所述需要读取的数据。 4. 根据权利要求 3 所述的方法, 其特征在于, 所述根据所述需要读取的数据的头部 信息和所述需要读取的数据的。

5、版本信息, 判断是否能够继续读取所述需要读取的数据, 包 括 : 检查所述头部信息中的成功标志位和版本信息, 判断所述成功标志位是否是成功读取 的标志, 且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本信息 一致 ; 如果所述成功标志位是成功读取的标志, 且所述头部信息中的版本信息与所述终端获 取到的第一文件的版本信息一致, 则确定能够读取所述需要读取的数据。 5. 根据权利要求 4 所述的方法, 其特征在于, 所述方法还包括 : 如果所述终端判断不能够读取所述需要读取的数据, 则删除所述需要读取的数据所在 的第一文件。 6. 根据权利要求 3-5 任一项所述的方法, 其特征。

6、在于, 所述读取所述需要读取的数据, 包括 : 所述需要读取的数据包括至少一个数据块, 对所述数据块执行反序列化处理, 以获得 所述需要读取的数据。 7. 根据权利要求 3 所述的方法, 其特征在于, 所述方法还包括 : 在读取所述需要读取的数据之前, 将所述成功标志位修改为未成功读取的标志 ; 在成功读取所述需要读取的数据后, 将所述成功标志位修改为成功读取的标志。 8. 一种处理数据的装置, 其特征在于, 所述装置包括 : 创建模块, 用于当需要在预设程序的第一文件中写入数据时, 为所述需要写入的数据 创建临时文件, 其中所述需要写入的数据包括至少一个数据块 ; 序列化模块, 用于对所述数。

7、据块进行序列化处理, 并将所述序列化的数据块存储到所 述创建模块创建的临时文件中 ; 替换模块, 用于在所述序列化模块存储所述序列化的数据块后, 用所述临时文件替换 权 利 要 求 书 CN 103136234 A 2 2/2 页 3 所述第一文件。 9. 根据权利要求 8 所述的装置, 其特征在于, 所述装置还包括 : 添加模块, 用于所述序列化模块对所述数据块进行序列化处理之前, 为所述需要写入 的数据添加头部信息, 所述头部信息包括所述需要写入的数据的数据长度、 版本信息和成 功标志位。 10. 根据权利要求 9 所述的装置, 其特征在于, 所述装置还包括 : 获取模块, 用于当需要读取。

8、所述预设程序的第一文件中的数据时, 从所述第一文件中 获取所述需要读取的数据的头部信息和所述第一文件的版本信息 ; 判断模块, 用于根据所述需要读取的数据的头部信息和所述第一文件的版本信息, 判 断是否能够读取所述需要读取的数据 ; 读取模块, 用于如果判断模块的判断结果为是, 则读取所述需要读取的数据。 11. 根据权利要求 10 所述的装置, 其特征在于, 所述判断模块具体用于 : 检查所述头部信息中的成功标志位和版本信息, 判断所述成功标志位是否是成功读取 的标志, 且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本信息 一致 ; 如果所述成功标志位是成功读取的标志, 且。

9、所述头部信息中的版本信息与所述终端获 取到的所述第一文件的版本信息一致, 则确定能够读取所述需要读取的数据。 12. 根据权利要求 11 所述的装置, 其特征在于, 所述装置还包括 : 删除模块, 用于如果所述判断模块判断出不能够读取所述需要读取的数据, 则删除所 述需要读取的数据所在的第一文件。 13. 根据权利要求 10-12 任一项所述的装置, 其特征在于, 所述读取模块具体用于 : 所述需要读取的数据包括至少一个数据块, 对所述数据块执行反序列化处理, 以获得 所述需要读取的数据。 14. 根据权利要求 10 所述的装置, 其特征在于, 所述装置还包括 : 第一修改模块, 用于在读取模。

10、块读取所述需要读取的数据之前, 将所述成功标志位修 改为未成功读取的标志 ; 第二修改模块, 用于在成功读取所述需要读取的数据后, 将所述成功标志位修改为成 功读取的标志。 权 利 要 求 书 CN 103136234 A 3 1/11 页 4 处理数据的方法和装置 技术领域 0001 本发明涉及通信技术领域, 特别涉及一种处理数据的方法和装置。 背景技术 0002 应用程序开发过程中, 经常需要存储数据到文件和读取数据, 而在数据存储和读 取的同时有下面两个重要的方面需要考虑 : 第一、 在存储和读取数据时不能阻塞界面用户 操作, 不能影响用于界面交互的流畅性 ; 第二、 数据的容错性和可升。

11、级性, 不能因为数据的 读写异常而导致整个程序的崩溃, 不能因为上次保存的数据有错或者不完整而导致下次启 动程序时读入数据出错导致程序启动不起来。 0003 现有技术中, 采用直接文件存储方式来进行数据存储。直接文件存储就是直接把 数据序列化后写入原文件, 在读取写入的数据时, 先把数据读入然后反序列化, 得到用户需 要的数据。序列化是将对象状态转换为可保持或传输的格式的过程, 与序列化相对的是反 序列化, 它将流转换为对象。这两个过程结合起来, 可以轻松地存储和传输数据。 0004 在实现本发明的过程中, 发明人发现现有技术至少存在以下问题 : 在数据量比较 大的时候, 直接写入大块数据, 。

12、磁盘 IO(Input/Output, 输入 / 输出 ) 运行比较慢, 会阻塞 UI(User Interface, 用户界面)交互, 写入数据过程中程序异常退出, 下次读取数据时数据 不完整, 可能会导致程序无法启动。 发明内容 0005 为了解决在数据写入时出现的问题, 本发明实施例提供了一种处理数据的方法和 装置。所述技术方案如下 : 0006 一方面, 提供了一种处理数据的方法, 所述方法包括 : 0007 当终端需要在预设程序的第一文件中写入数据时, 为所述需要写入的数据创建临 时文件, 其中所述需要写入的数据包括至少一个数据块 ; 0008 对所述数据块进行序列化处理, 并将所述。

13、序列化的数据块存储到所述临时文件 中 ; 0009 在存储所述序列化的数据块后, 用所述临时文件替换所述第一文件。 0010 所述对所述数据块进行序列化处理之前, 还包括 : 0011 为所述需要写入的数据添加头部信息, 所述头部信息包括所述需要写入的数据的 数据长度、 版本信息和成功标志位。 0012 所述方法还包括 : 0013 当所述终端需要读取所述预设程序的第一文件中的数据时, 从所述第一文件中获 取所述需要读取的数据的头部信息和所述第一文件的版本信息 ; 0014 根据所述需要读取的数据的头部信息和所述第一文件的版本信息, 判断是否能够 读取所述需要读取的数据 ; 0015 如果是,。

14、 则读取所述需要读取的数据。 说 明 书 CN 103136234 A 4 2/11 页 5 0016 所述根据所述需要读取的数据的头部信息和所述第一文件的版本信息, 判断是否 能够继续读取所述需要读取的数据, 包括 : 0017 检查所述头部信息中的成功标志位和版本信息, 判断所述成功标志位是否是成功 读取的标志, 且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本 信息一致 ; 0018 如果所述成功标志位是成功读取的标志, 且所述头部信息中的版本信息与所述终 端获取到的所述第一文件的版本信息一致, 则确定能够读取所述需要读取的数据。 0019 所述方法还包括 : 0020。

15、 如果所述终端判断出不能够读取所述需要读取的数据, 则删除所述需要读取的数 据所在的第一文件。 0021 所述读取所述需要读取的数据, 包括 : 0022 所述需要读取的数据包括至少一个数据块, 对所述数据块执行反序列化处理, 以 获得所述需要读取的数据。 0023 所述方法还包括 : 0024 在读取所述需要读取的数据之前, 将所述成功标志位修改为未成功读取的标志 ; 0025 在成功读取所述需要读取的数据后, 将所述成功标志位修改为成功读取的标志。 0026 另一方面, 还提供了一种处理数据的装置, 所述装置包括 : 0027 创建模块, 用于当需要在预设程序的第一文件中写入数据时, 为所。

16、述需要写入的 数据创建临时文件, 其中所述需要写入的数据包括至少一个数据块 ; 0028 序列化模块, 用于对所述数据块进行序列化处理, 并将所述序列化的数据块存储 到所述创建模块创建的临时文件中 ; 0029 替换模块, 用于在所述序列化模块存储所述序列化的数据块后, 用所述临时文件 替换所述第一文件。 0030 所述装置还包括 : 0031 添加模块, 用于所述序列化模块对所述数据块进行序列化处理之前, 为所述需要 写入的数据添加头部信息, 所述头部信息包括所述需要写入的数据的数据长度、 版本信息 和成功标志位。 0032 所述装置还包括 : 0033 获取模块, 用于当需要读取所述预设程。

17、序的第一文件中的数据时, 从所述第一文 件中获取所述需要读取的数据的头部信息和所述第一文件的版本信息 ; 0034 判断模块, 用于根据所述需要读取的数据的头部信息和所述第一文件的版本信 息, 判断是否能够读取所述需要读取的数据 ; 0035 读取模块, 用于如果判断模块的判断结果为是, 则读取所述需要读取的数据。 0036 所述判断模块具体用于 : 0037 检查所述头部信息中的成功标志位和版本信息, 判断所述成功标志位是否是成功 读取的标志, 且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本 信息一致 ; 0038 如果所述成功标志位是成功读取的标志, 且所述头部信息中的。

18、版本信息与所述终 端获取到的所述第一文件的版本信息一致, 则确定能够读取所述需要读取的数据。 说 明 书 CN 103136234 A 5 3/11 页 6 0039 所述装置还包括 : 0040 删除模块, 用于如果所述判断模块判断出不能够读取所述需要读取的数据, 则删 除所述需要读取的数据所在的第一文件。 0041 所述读取模块具体用于 : 0042 所述需要读取的数据包括至少一个数据块, 对所述数据块执行反序列化处理, 以 获得所述需要读取的数据。 0043 所述装置还包括 : 0044 第一修改模块, 用于在读取模块读取所述需要读取的数据之前, 将所述成功标志 位修改为未成功读取的标志。

19、 ; 0045 第二修改模块, 用于在成功读取所述需要读取的数据后, 将所述成功标志位修改 为成功读取的标志。 0046 本发明实施例提供的技术方案带来的有益效果是 : 采用异步写入数据的方法, 在 数据写入过程中不阻塞用户界面操作, 能够预防数据格式错误或数据不完整而影响程序的 使用, 提高程序容错性和稳定性。 附图说明 0047 为了更清楚地说明本发明实施例中的技术方案, 下面将对实施例描述中所需要使 用的附图作简单地介绍, 显而易见地, 下面描述中的附图仅仅是本发明的一些实施例, 对于 本领域普通技术人员来讲, 在不付出创造性劳动的前提下, 还可以根据这些附图获得其他 的附图。 0048。

20、 图 1 是本发明实施例 1 中提供的一种处理数据的方法的流程 ; 0049 图 2 是本发明实施例 2 中提供的一种处理数据的方法的流程 ; 0050 图 3 是本发明实施例 3 中提供的一种处理数据的方法的流程 ; 0051 图 4 是本发明实施例 3 中提供的一种处理数据的方法的流程 ; 0052 图 5 是本发明实施例 4 中提供的一种处理数据的装置的示意图 ; 0053 图 6 是本发明实施例 4 中提供的另一种处理数据的装置的示意图。 具体实施方式 0054 为使本发明的目的、 技术方案和优点更加清楚, 下面将结合附图对本发明实施方 式作进一步地详细描述。 0055 实施例 1 0。

21、056 参见图 1, 本发明实施例提供了一种处理数据的方法, 包括 : 0057 101 : 当终端需要在预设程序的第一文件中写入数据时, 为所述需要写入的数据创 建临时文件, 其中所述需要写入的数据包括至少一个数据块 ; 0058 102 : 对所述数据块进行序列化处理, 并将所述序列化的数据块存储到所述临时文 件中 ; 0059 103 : 在存储所述序列化的数据块后, 用所述临时文件替换所述第一文件。 0060 本实施例中, 所述对所述数据块进行序列化处理之前, 还包括 : 0061 为所述需要写入的数据添加头部信息, 所述头部信息包括所述需要写入的数据的 说 明 书 CN 103136。

22、234 A 6 4/11 页 7 数据长度、 版本信息和成功标志位。 0062 进一步地, 本实施例中, 所述方法还包括 : 0063 当所述终端需要读取所述预设程序的第一文件中的数据时, 从所述第一文件中获 取所述需要读取的数据的头部信息和所述第一文件的版本信息 ; 0064 根据所述需要读取的数据的头部信息和所述第一文件的版本信息, 判断是否能够 读取所述需要读取的数据 ; 0065 如果是, 则读取所述需要读取的数据。 0066 其中, 所述根据所述需要读取的数据的头部信息和所述第一文件的版本信息, 判 断是否能够读取所述需要读取的数据, 包括 : 0067 检查所述头部信息中的成功标志。

23、位和版本信息, 判断所述成功标志位是否是成功 读取的标志, 且所述头部信息中的版本信息是否与所述终端获取到的所述第一文件的版本 信息一致 ; 0068 如果所述成功标志位是成功读取的标志, 且所述头部信息中的版本信息与所述终 端获取到的第一文件的版本信息一致, 则确定能够读取所述需要读取的数据。 0069 本实施例中, 所述方法还包括 : 0070 如果所述终端判断出不能够读取所述需要读取的数据, 则删除所述需要读取的数 据所在的第一文件。 0071 其中, 所述读取所述需要读取的数据, 包括 : 0072 所述需要读取的数据包括至少一个数据块, 对所述数据块执行反序列化处理, 以 获得所述需。

24、要读取的数据。 0073 优选地, 本实施例中, 所述方法还包括 : 0074 在读取所述需要读取的数据之前, 将所述成功标志位修改为未成功读取的标志 ; 0075 在成功读取所述需要读取的数据后, 将所述成功标志位修改为成功读取的标志。 0076 本发明提供的方法实施例的有益效果是 : 采用异步写入数据的方法, 在数据写入 过程中不阻塞用户界面操作, 能够预防数据格式错误或数据不完整而影响应用的使用, 提 高程序容错性和稳定性。 0077 实施例 2 0078 参见图 2, 本发明实施例提供了一种处理数据的方法, 为了在读写文件不阻塞 UI 线程, 使用 Symbian 平台 RFile 的。

25、异步读写接口, void Read(TInt aPos, TDes8&aDes, TInt aLength, TRequestStatus&aStatus)const ; voidWrite(const TDesC8&aDes, TRequestStatus&aStatus) ; 和活动对象 CActive, 每次读写一块数据, 并尽量减少读写文 件次数, 该方法包括 : 0079 201 : 终端获取需要在本地预设程序的第一文件中写入的数据。 0080 本实施例中, 终端包括 : 手机、 手持设备等, 对此本实施例不做具体限定。 预设程序 指需要写入数据的程序, 并可以提供给用户读取数据的程。

26、序, 如开心网、 QQ 等。第一文件是 指预设程序指定的存储下载信息的文件。 0081 本实施例中, 终端启动预设程序后, 在该程序的运行过程中, 需要在互联网上下载 大数量的数据, 一般超过10M, 终端需要将获取到的数据存储到该程序中。 如, 用户登录某一 网站, 并在该网站上预订了关于某个事件的消息, 如果终端检测到有关于该事件的消息, 则 说 明 书 CN 103136234 A 7 5/11 页 8 会将该消息下载到终端上, 再将该消息进行异步存储。 其中, 终端上需要写入的数据一般比 较大, 包括至少一个数据块。 0082 202 : 终端为需要写入的数据创建临时文件。 0083 。

27、本实施例中, 为了保证写入数据异常后不会影响旧的数据, 保持下次读取数据的 完整性, 当终端需要在本地预设程序的第一文件中写入数据时, 先创建一个临时文件, 在对 需要写入的数据处理完毕后, 将处理完的数据存储到临时文件中, 这样如果在数据处理过 程中出现异常, 也不会因为异常而影响到原文件。 0084 203 : 终端为需要写入的数据添加头部信息。 0085 本实施例中, 为保证读取的数据和写入的数据保持一致, 可以为需要写入的数据 添加头部信息, 所述头部信息包括所述需要写入的数据的数据长度、 版本信息和写入文件 的次数等。在读取数据时, 就可以根据头部信息, 获得与写入数据一致的数据, 。

28、不会因为数 据不一致而导致读取错误。如, 写入文件的长度是 10 个数据块, 则将该文件的长度写入到 头部信息中, 在读取该文件的时候, 就可以根据该文件的长度对该文件进行判断。 因此保存 数据时需要加入额外数据如写入文件的次数, 和每次写入文件的数据长度, 以保证读取数 据时和写入数据保持一致。 本实施例中, 在头部信息中还可以预留成功标志位, 成功标志位 用于标识上次读取第一文件时是否成功。其中在第一文件写入过程中, 默认该成功标志位 为成功读取的标志位。 0086 本步骤为可选步骤, 具体实现过程中也可以不执行本步骤, 直接执行步骤 204。 0087 204 : 终端对每个数据块进行序。

29、列化处理。 0088 本实施例中, 终端获取到需要写入的数据后, 可以先把内存中格式化的数据通过 RWriteStream 序列化为可存储的二进制数据, 然后异步写入文件, 读取数据时, 先异步读取 数据, 然后通过 RReadStream 反序列化为内存结构化数据。这两个过程需要始终保持一致, 包括写入文件大小和读取文件大小, 序列化和反序列化函数。 0089 205 : 判断上述数据块的序列化是否成功, 如果是, 则执行步骤 206, 否则停止写 入。 0090 本实施例中, 在对数据进行序列化后, 判断序列化是否成功, 因为由于异常原因, 可能影响数据的序列化, 导致序列化失败, 如手机。

30、电池电量不足自动关机, 或是用户退出该 程序。如果发现序列化失败, 则停止写入数据, 写入失败, 这样也保证了原文件不会受到损 伤。 0091 206 : 将序列化成功后的数据块存储到临时文件中。 0092 本实施例中, 写入数据时先把数据写入到一个临时文件, 等写入成功后再删除原 文件, 改名临时文件为原文件名。 可以保证写入数据异常后不会影响旧的数据, 保持下次读 取数据的完整性。 0093 207 : 判断存储序列化后的数据是否成功, 如果是, 则执行步骤 208, 否则停止写 入。 0094 本实施例中, 在存储序列化的数据的过程中, 同步骤 203 一样, 由于异常原因可能 导致存储。

31、失败, 如手机电池电量不足自动关机, 或是用户退出该程序。如果发现存储失败, 则停止写入数据, 写入失败, 这样也保证了原文件不会受到损伤。 0095 208 : 判断是否将所有需要写入的数据块都处理完毕, 如果是, 则执行步骤 207, 否 说 明 书 CN 103136234 A 8 6/11 页 9 则, 执行步骤 202。 0096 本实施例中, 进一步地, 提供同步写入操作, 在程序退出时如果异步写入数据还没 完成, 则切换到同步写入操作, 即返回步骤202, 直到完成写入程序才退出。 如果所有的数据 块都处理完毕, 则执行步骤 207。 0097 本实施例中, 同步相对于异步写文件。

32、, 异步写文件是调用写入函数后, 会立即返 回, 后台系统文件服务继续执行写入操作。而同步写入时, 调用写入函数后, 会一直等待系 统文件服务写入操作完成后才返回。 0098 209 : 用临时文件替换第一文件。 0099 本实施例中, 写入数据时先把数据写入到一个临时文件, 等写入成功后再删除原 文件, 将临时文件的名称修改为第一文件的名称, 即用临时文件替换第一文件, 这样可以保 证写入数据异常后不会影响旧的数据, 保持下次读取数据的完整性。 0100 其中, 步骤 203-209 具体执行的是 : 对数据块进行序列化处理, 并将所述序列化的 数据块存储到所述临时文件中 ; 在存储所述序列。

33、化的数据块后, 用所述临时文件替换所述 第一文件的步骤。 0101 本实施例中, 在具体实现时, 封装步骤 201-207 的逻辑操作到类 CDataFileStore 中, 并对外提供简单接口, 如 : 0102 IMPORT_C void StartWrite(MDataFileStoreObserver*aObserver) ; 0103 IMPORT_C void StartRead(MDataFileStoreObserver*aObserver) ; 0104 IMPORT_C void SynWrite(MDataFileStoreObserver*aObserver) ; 01。

34、05 在读写数据时, 定义接口作为回调, 需要外部实现, 完成数据的序列化和反序列化 操作和读写数据完成和失败的通知。 0106 本发明提供的方法实施例的有益效果是 : 采用异步写入数据的方法, 在数据写入 过程中不阻塞用户界面操作, 能够预防数据格式错误或数据不完整而影响应用的使用, 提 高程序容错性和稳定性。并封装基本逻辑操作, 对外提供简单接口, 减少后续代码开发量。 0107 实施例 3 0108 参见图 3, 本发明实施例提供了一种处理数据的方法, 本实施例提供的处理数 据的方法是同实施例 2 提供的处理数据的方法相对应的, 同实施例 2 一样, 为了在读写 文件不阻塞 UI 线程,。

35、 可以使用 Symbian 平台 RFile 的异步读写接口, void Read(TInt aPos, TDes8&aDes, TInt aLength, TRequestStatus&aStatus)const ; voidWrite(const TDesC8&aDes, TRequestStatus&aStatus) ; 和活动对象 CActive, 每次读写一块数据, 并尽 量减少读写文件次数, 该方法包括 : 0109 301 : 终端启动预设程序后, 获取需要读取的数据的头部信息和第一文件的版本信 息。 0110 本实施例中, 在实施例 2 中写入数据时, 在数据中添加了头部信息,。

36、 当所述终端需 要读取所述预设程序的第一文件中的数据时, 从所述第一文件中检查所述需要读取的数据 的头部信息, 头部信息中包括数据的版本信息、 成功标志位和数据的长度等。 0111 本实施例中, 终端启动预设程序后, 获取第一文件的版本信息, 该版本信息是终端 启动预设程序后获取到的, 第一文件的版本信息与头部信息中包括的版本信息的具体内容 可能一样, 也可能不同。 说 明 书 CN 103136234 A 9 7/11 页 10 0112 302 : 根据所述需要读取的数据的头部信息和第一文件的版本信息, 判断是否能够 读取所述需要读取的数据, 如果是, 则执行步骤 303, 否则, 停止读。

37、取数据, 并删除数据文件。 0113 本实施例中, 在文件开始处加入头部信息, 保存读取是否成功标识, 数据格式版本 等信息。 读取是否成功标志在每次读取数据开始时会写入该信息为false, 读取成功后再写 入 true, 如果读取过程由于文件不完整或格式有错导致程序退出, 下次读取时检查该标志, 可以提前结束读取数据, 保护下次读取数据不会导致程序退出。每次读取数据时先检查所 述头部信息中的成功标志位和版本信息, 判断所述成功标志位是否是成功读取的标志, 且 所述头部信息中的版本信息是否与所述终端获取到的第一文件的版本信息一致, 成功标志 位为成功读取标志, 且头部信息中的版本信息和第一文件。

38、的版本信息一致则继续读取需要 读取的数据。 0114 本实施例中, 如果判断出所述终端不能够继续读取所述需要读取的数据, 即成功 标志位位未成功读取的标志或是版本信息不一样, 则停止读取所述需要读取的数据, 并删 除所述需要读取的数据所在的文件。 0115 本步骤具体执行的是 : 根据所述需要读取的数据的头部信息和第一文件的版本信 息, 判断是否能够继续读取所述需要读取的数据。 0116 303 : 重置读取成功标志位。 0117 本实施例中, 如果读取成功标志位成功, 则将读取成功标志位重置, 如将成功标志 位置为 “0” , 等待本次读取成功后, 再将该标志位修改为 “1” , 如果本次读。

39、取失败, 则不再修 改该成功标志位, 本次读取数据失败, 则读取成功标志位为 “0” 。 0118 304 : 读取数据。 0119 参见图 4, 本实施例中, 需要读取的数据包括至少一个数据块, 读取数据具体包括 以下步骤 305-307 : 0120 305 : 根据所述需要读取的数据的头部信息, 判断读取到的数据块是否是需要读 取数据的最后一个数据块, 如果是, 则将成功标志位修改为成功读取的标志, 否则执行步骤 306。 0121 本实施例中, 由于在写入数据时, 在数据中写入了头部信息, 包括写入文件的数据 长度, 如写入了文件的数据长度为 10 个文件块, 则在读取该写入文件的时候。

40、, 读出该文件 的长度为10个文件块, 但实际过程中, 只读取了8个文件块, 其余的两个文件块可能被破坏 了, 在这种情况下, 终端判断出还存在两个未读取的数据, 则需要对这个文件进行修复。如 果实际读取过程中, 读到了 10 个文件块, 则与头部信息写入的文件长度一致, 则说明已读 取完整个文件, 将该文件的头部信息中的成功标志位修改为成功读取的标志。 其中, 可以用 “1” 表示读取成功, 本实施例对此不做具体限定。 0122 306 ; 对读取到的数据块进行反序列化处理, 以获得需要读取的数据。 0123 本实施例中, 为保证能够正确读取数据, 反序列化函数和实施例 2 中的序列化函 数。

41、是相对应的。 0124 307 : 判断对数据块进行的反序列化处理是否成功, 如果是, 则执行步骤 305, 否则 停止读取。 0125 本实施例中, 在得到反序列化数据后, 解析反序列化数据, 判断得到的数据是否正 确, 如果正确, 则返回步骤 305 继续执行, 依次读取所有的数据块, 直到所有的数据块都读 说 明 书 CN 103136234 A 10 8/11 页 11 取完毕, 否则, 读取失败, 停止读取数据。 0126 步骤 301-307 具体执行的是 : 当所述终端需要读取所述预设程序的第一文件中的 数据时, 从所述第一文件中获取所述需要读取的数据的头部信息和所述第一文件的版。

42、本信 息 ; 根据所述需要读取的数据的头部信息和所述第一文件的版本信息, 判断是否能够读取 所述需要读取的数据 ; 如果是, 则读取所述需要读取的数据的步骤。 0127 本实施例中, 在具体实现时, 封装步骤 301-307 的逻辑操作到类 CDataFileStore 中, 并对外提供简单接口, 如 : 0128 IMPORT_C void StartWrite(MDataFileStoreObserver*aObserver) ; 0129 IMPORT_C void StartRead(MDataFileStoreObserver*aObserver) ; 0130 IMPORT_C v。

43、oid SynWrite(MDataFileStoreObserver*aObserver) ; 0131 在读写数据时, 定义接口作为回调, 需要外部实现, 完成数据的序列化和反序列化 操作和读写数据完成和失败的通知。 0132 本发明提供的方法实施例的有益效果是 : 采用异步读取的方法, 在数据读取过程 中不阻塞用户界面操作, 能够预防数据格式错误或数据不完整而影响应用的使用, 提高程 序容错性和稳定性。并封装基本逻辑操作, 对外提供简单接口, 减少后续代码开发量。 0133 实施例 4 0134 参见图 5, 本发明实施例提供了一种处理数据的装置, 该装置包括 : 创建模块 401、 序。

44、列化模块 402 和替换模块 403。 0135 创建模块 401, 用于当需要在预设程序的第一文件中写入数据时, 为所述需要写入 的数据创建临时文件, 其中所述需要写入的数据包括至少一个数据块。 0136 本实施例中的装置可以对应实施例 2 和实施例 3 中的终端, 终端包括 : 手机、 手持 设备等, 对此本实施例不做具体限定。 预设程序指需要写入数据的程序, 并可以提供给用户 读取数据的程序, 如开心网、 QQ 等。第一文件是指预设程序指定的存储下载信息的文件。 0137 本实施例中, 终端启动预设程序后, 在该程序的运行过程中, 需要在互联网上下载 大数量的数据, 一般超过10M, 终。

45、端需要将获取到的数据存储到该程序中。 如, 用户登录某一 网站, 并在该网站上预订了关于某个事件的消息, 如果终端检测到有关于该事件的消息, 则 会将该消息下载到终端上, 再将该消息进行异步存储。 其中, 终端上需要写入的数据一般比 较大, 包括至少一个数据块。 0138 本实施例中, 为了保证写入数据异常后不会影响旧的数据, 保持下次读取数据的 完整性, 当终端需要在本地预设程序的第一文件中写入数据时, 通过创建模块 401 先创建 一个临时文件, 在对需要写入的数据处理完毕后, 将处理完的数据存储到临时文件中, 这样 如果在数据处理过程中出现异常, 也不会因为异常而影响到原文件。 0139。

46、 参见图 6, 进一步地, 可选地所述装置还包括 : 0140 添加模块 404, 用于所述序列化模块对所述数据块进行序列化处理之前, 为所述需 要写入的数据添加头部信息, 所述头部信息包括所述需要写入的数据的数据长度、 版本信 息和成功标志位。 0141 本实施例中, 为保证读取的数据和写入的数据保持一致, 添加模块 404 可以为需 要写入的数据添加头部信息, 所述头部信息包括所述需要写入的数据的数据长度、 版本信 息和写入文件的次数等。在读取数据时, 就可以根据头部信息, 获得与写入数据一致的数 说 明 书 CN 103136234 A 11 9/11 页 12 据, 不会因为数据不一致。

47、而导致读取错误。如, 写入文件的长度是 10 个数据块, 则将该文件 的长度写入到头部信息中, 在读取该文件的时候, 就可以根据该文件的长度对该文件进行 判断。 因此保存数据时需要加入额外数据如写入文件的次数, 和每次写入文件的数据长度, 以保证读取数据时和写入数据保持一致。本实施例中, 在头部信息中还可以预留成功标志 位, 成功标志位用于标识上次读取第一文件时是否成功。 其中在第一文件写入过程中, 默认 该成功标志位为成功读取的标志位。 0142 序列化模块 402, 用于对所述数据块进行序列化处理, 并将所述序列化的数据块存 储到所述创建模块创建的临时文件中。 0143 本实施例中, 终端。

48、获取到需要写入的数据后, 序列化模块 402 可以先把内存中格 式化的数据通过 RWriteStream 序列化为可存储的二进制数据, 然后异步写入文件, 读取数 据时, 先异步读取数据, 然后通过 RReadStream 反序列化为内存结构化数据。这两个过程需 要始终保持一致, 包括写入文件大小和读取文件大小, 序列化和反序列化函数。 0144 本实施例中, 序列化模块 402 在对数据进行序列化后, 判断序列化是否成功, 因为 由于异常原因, 可能影响数据的序列化, 导致序列化失败, 如手机电池电量不足自动关机, 或是用户退出该程序。如果发现序列化失败, 则停止写入数据, 写入失败, 这样。

49、也保证了原 文件不会受到损伤。 0145 本实施例中, 序列化模块 402 写入数据时先把数据写入到一个临时文件, 等写入 成功后再删除原文件, 改名临时文件为原文件名。可以保证写入数据异常后不会影响旧的 数据, 保持下次读取数据的完整性。 0146 本实施例中, 序列化模块 402 在存储序列化的数据的过程中, 也可能由于异常原 因可能导致存储失败, 如手机电池电量不足自动关机, 或是用户退出该程序。 如果发现存储 失败, 则停止写入数据, 写入失败, 这样也保证了原文件不会受到损伤。 0147 本实施例中, 进一步地, 提供同步写入操作, 在程序退出时如果异步写入数据还没 完成, 则切换到同步写入操作。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1