自动释放文件资源的方法、存储介质、电子设备以及系统与流程

文档序号:16390222发布日期:2018-12-22 11:19阅读:191来源:国知局
自动释放文件资源的方法、存储介质、电子设备以及系统与流程

本发明涉及一种软件内存管理中自动释放文件资源的方法,属于计算机信息处理领域。

背景技术

在android软件的开发过程中我们经常会使用到文件等操作功能,文件操作涉及到文件资源的申请,文件对象的操作等。传统方案中使用文件的时候经常会遗忘对文件所占用的内存空间进行释放,这样就非常容易导致“内存泄漏”(memoryleak,也就是计算机的内存硬件资源被无用的文件长期占用,导致可用内存空间减少,好比内存库被泄漏了一样,因而得名“内存泄漏”)的风险出现,长时间内存泄漏可能会导致系统异常进而导致程序崩溃。

传统方案中操作文件通常都会有文件句柄的持有,文件的读写中也会产生各种各样的异常信息,如果持有文件句柄的文件类没有及时对文件句柄进行释放或者释放出错,这时候就非常容易导致文件资源被占用或者文件无法被打开。

也就是说,传统的文件读写过程中容易出现内存泄漏的情况,而现有的文件句柄的方法并不能很好的解决这些问题。



技术实现要素:

本发明是为了解决上述问题而进行的,目的在于提供一种自动释放文件资源的方法、存储介质、电子设备以及系统。

本发明提供了一种自动释放文件资源的方法,用于实现文件读写并自动释放内存中的文件所占用的内存资源,其特征在于,包括以下步骤:

设置文件读写函数来对文件进行读写操作,该读写函数被设置为公有类型且具有文件路径这一参数;

根据文件路径对所述读写函数进行校验;

校验通过后开辟子线程进行读写操作;

关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源;

主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息。

本发明提供的自动释放文件资源的方法,还可以具有这样的特征,其中,所述读写操作中包括异常清理步骤,当读写出现异常时,对异常的文件进行提取并清理。

本发明提供的自动释放文件资源的方法,还可以具有这样的特征,其中,释放文件对象的资源信息的具体过程为:

在读写函数的代码块中调用清理函数,

子线程向主线程发出内存清理的请求,

主线程回应请求,并调用清理函数对子线程进行清理来释放文件对象的资源信息。

本发明提供的自动释放文件资源的方法,还可以具有这样的特征,其中,所述清理函数是公有类型的。

本发明提供的自动释放文件资源的方法,还可以具有这样的特征,其中,所述校验的的过程是:判断读写函数中的文件路径这个参数是否为空,如果为空,则校验不通过并结束文件的读取。

本发明提供的自动释放文件资源的方法,还可以具有这样的特征,其中,读写操作包括以下的过程:

开辟子线程,

将所述读写函数中的文件路径转变为一个文件对象,

判断该文件对象是否存在,存在就进入下一步,

当该文件对象存在时就读取到对应的所述文件长度的内容信息,并将该内容信息封装到局部的字符串类型的变量中。

本发明提供的自动释放文件资源的方法,还可以具有这样的特征,其中,主线程和子线程之间建立通信是依赖线程间通信工具handler来实现的。

本发明还提供一种存储介质,该存储介质上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现上述的方法。

本发明还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,其特征在于:处理器执行计算机程序时实现上述的方法。

本发明还提供一种自动释放文件资源的系统,用于实现文件读写并自动释放内存中的文件所占用的内存资源,其特征在于,包括:

读写函数设置模块,其用于设置文件读写函数来对文件进行读写操作,该读写函数被设置为公有类型且具有文件路径和文件长度这两个参数;

校验模块,用于对所述读写函数进行校验;

读写操作模块,用于在校验通过后开辟子线程进行读写操作;

内存释放模块,用于关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源;

通信模块,用于在主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息。

本发明的作用和效果在于:根据本发明所涉及的自动释放文件资源的方法,因为设置文件读写函数来对文件进行读写操作;对所述读写函数进行校验;校验通过后开辟子线程进行读写操作;关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源;主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息,也就是说,在子线程中使用读写函数进行读写操作,并在读写完成后将读取的文件对象所占用的内存资源进行清理,不会占用内存,然后将读取到的信息发送给主线程完成文件的读写过程,由于是通过子线程的读写函数来读写并立即消除内存,所以既能对文件进行读写,又不会因为读取大量的文件对象而导致文件对内存资源的占用,解决了内存泄漏的问题。

附图说明

图1为本发明的实施例中的自动释放文件资源的方法的步骤示意图;

图2为本发明的实施例中的读写操作的具体步骤示意图;

图3为本发明的实施例中的内存清理的具体步骤示意图;以及

图4为本发明的实施例中的自动释放文件资源的系统的结构示意图。

具体实施方式

为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,以下实施例结合附图对本发明自动释放文件资源的方法、存储介质、电子设备以及系统作具体阐述。

本发明的自动释放文件资源的方法可以运行在多种操作平台上,包括安卓android、苹果ios、微软windows以及linux、unix等平台,通过运用在这些平台上,能够解决设备在文件读写时,自动释放内存中的文件所占用的内存资源,解决内存泄露的问题。

以下以运行在智能移动终端的安卓android系统为例,来具体说明本发明的自动释放文件资源的方法。

实施例1

图1为本发明的实施例中的自动释放文件资源的方法的步骤示意图。

如图1所示,自动释放文件资源的方法包括以下的步骤s1至s5。

步骤s1,设置文件读写函数来对文件进行读写操作,该读写函数被设置为公有类型且具有文件路径这一参数。

本步骤主要实现文件读写函数的设计及定义。

文件读写通常涉及两个方面的信息:文件路径filepath、要读取文件的长度信息length等。

基于上述文件读写的信息本实施例设计了一个文件的读写函数readfile,具体的函数定义如下所示:

publicstaticstringreadfile(stringfilepath,longlength)该函数我们设计成为public公有类型的,这样可以方便所有的调用者具有调用该函数的权限。

readfile函数读取到的是限定长度为length的内容信息,且内容信息是一个字符string类型的数据,并返回来进行处理。

通过设置这样一个文件读写函数readfile,后续对文件的读取都是通过该readfile函数来实现的,并且该函数只需要满足能够实现文件资源的自动释放。

步骤s2,根据文件路径对所述读写函数进行校验。

在实施文件读取之前首先需要对readfile函数参数进行校验处理,所述校验的的过程是判断读写函数中的文件路径这个参数是否为空,如果为空,则校验不通过并结束文件的读取。

具体的校验方法是通过调用

filepath==null||filepath.equals(“”)

这个函数的方法来判断filepath是否等于空值null,并且判断filepath的字符串内容“”是不是空内容。

如果这两个条件有一个成立,说明filepath这个函数的参数在传递过程中会有异常出现,此时不用进行下一步,直接通过returnnull返回空语句来结束整个读取流程。

步骤s3,校验通过后开辟子线程进行读写操作。

由于文件读写是一个耗时操作,因此我们需要开辟一个子线程来对文件读写进行操作避免文件读写阻塞主线程而导致的界面卡顿情况。

图2为本发明的实施例中的读写操作的具体步骤示意图。

这样后续的读写操作都会在这个子线程thread中进行,其进行读写操作具体包括以下的子步骤s3-1至s3-4:

步骤s3-1,开辟子线程。

开启子线程的方法是通过函数代码:

threadthread=newthread(newreadrunnable());

的方式来构建一个线程thread,其中readrunnable是文件操作所在的子线程任务,然后通过调用thread中的thread.start()方法开启一个子线程任务。

步骤s3-2,将所述读写函数中的文件路径转变为一个文件对象。

在步骤s2校验通过后,接下来我们需要在任务子线程readrunnable中开始文件的读取操作,首先通过filefile=newfile(filepath)函数来将filepath路径对应的文件转变成一个file文件对象。

步骤s3-3,判断该文件对象是否存在,存在就进入下一步。

接下来通过调用file对象中的file.exists()函数来判定该文件对象是否存在,如果file.exists()函数返回true表示存在,否则表示不存在。

如果文件不存在此时直接returnnull结束整个文件的读取操作流程。

步骤s3-4,当该文件对象存在时就读取到对应的所述文件长度的内容信息,并将该内容信息封装到局部的字符串类型的变量中。

在文件存在时,通过通用的文件读取方法到文件长度为length的内容信息,并且将该信息封装到一个局部的字符string类型的变量contentstr中。

步骤s4,关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源。

在文件的读取过程中会使用到各种文件对象,我们将这些文件对象命名为filestream文件流对象,然后通过调用filestream对象中的filestream.close()来关闭文件流资源信息,再调用file=null来释放文件file对象的资源信息。

通过这一个过程就实现了对于读取过的文件的内存能够实时的释放。

步骤s5,主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息。

以上的步骤s1到s4实现了在子线程readrunnable中对文件进行读取并实时的释放该文件锁占用的内存的过程,但主线程并没有获取到子线程读取的文件内容。

步骤s5就是用于实现将开辟的子线程readrunnable读取到的文件发送给主线程的过程的。

首先,通过android系统提供的一个主线程和子线程信息通信的工具句柄handler类来构建一个传统过程来传递mhandler对象:

handlermhandler=newhandler(),

然后,构建一个mbundler:

bundlermbundler=newbundler()

其次,在使用上述的代码构建了一个mbundler对象后,再通过调用mbunder对象中的mbundler.putstring(contentstr)方法将contentstr的内容存放在mbundler对象中。

最后,调用mhandler.sendmessage(newmessage(mbundler))方法将mbundler对象封装到一个message对象中发送到主线程。

主线程接受到该消息后通过getbundler()方法获取到传递过来的mbundler对象,然后调用mbundler对象中的mbundler.getstring()方法来获取到读取到的内容信息,这样就完成了将子线程readrunnable读取到的文件发送给主线程,从而使得主线程获取子线程读取到文件的内容的过程,而且该过程中子线程是边读取文件边消除文件占用的内存的,从而实现了文件的自动释放。

上述实现方法能够解决正常情况下的资源文件的自动释放,但是如果在某些异常情况下:申请好了文件读写资源,但是在读写过程出现了异常情况,这样就会导致文件资源无法进行释放,从而导致内存泄漏的情况依然发生,以下就专门针对异常情况下的文件资源释放进行说明和进一步的处理操作。

为了能够知晓异常情况的发生,本实施例还设计了一个try-catch代码块,在步骤s4的代码块插入以下的try-catch代码块来捕获读写操作中的异常信息。具体的try-catch代码块设计如下所示:

try{

正常读写代码块

}catch(exceptione){

异常代码块

}

当发现了异常情况也就是try-catch代码块发现了异常代码后,在步骤s4中加入了以下的子步骤,如下图3所示。

图3为本发明的实施例中的内存清理的具体步骤示意图。

步骤s4-1,在读写函数的代码块中调用清理函数。

为了能够对文件资源的释放进行统一的处理,我们首先将步骤s4清理文件资源部分操作封装成一个自定义的清理函数clear_resource,函数的定义是publicvoidclearresource(),然后我们该函数中通过调用filestream.close()和file=null的方式来对文件资源进行释放。其中,所述清理函数是公有类型的,这样便于调用。

步骤s4-2,子线程向主线程发出内存清理的请求。

在正常读写代码块的逻辑最后一行,我们通过调用mhandler.sendemptymessage(clear_resource)这个android系统自带的函数来实现向主线程发送一个文件内存清理的业务请求。

在主线程中对clear_resource消息的处理过程中,调用上述的自定义clearresource函数来对资源进行清理操作。

步骤s4-3,主线程回应请求,并调用清理函数对子线程进行清理来释放文件对象的资源信息。

当正常业务逻辑代码块出现异常情况后,该异常会被上述的try-catch代码块检测到,此时代码会直接执行到异常代码块流程,此时我们在异常代码块流程try-catch代码块中通过调用mhandler.sendemptymessage(clear_resource)方法来发送一个自动清理操作的请求,此时就会主动触发清理函数clearresource()来完成清理操作,这样就能够在正常和异常情况下都实现资源的自动释放处理逻辑了。

实施例2

以下对本实施例提供的一种电子设备进行详细的说明。

电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,其特征在于:处理器执行计算机程序时实现以下步骤的方法:

步骤s1,设置文件读写函数来对文件进行读写操作,该读写函数被设置为公有类型且具有文件路径这一参数。

步骤s2,根据文件路径对所述读写函数进行校验。

步骤s3,校验通过后开辟子线程进行读写操作。

步骤s4,关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源。

步骤s5,主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息。

进一步,作为一种优化的电子设备,上述的步骤s3校验通过后开辟子线程进行读写操作具体包括以下的子步骤:

步骤s3-1,开辟子线程。

步骤s3-2,将所述读写函数中的文件路径转变为一个文件对象。

步骤s3-3,判断该文件对象是否存在,存在就进入下一步。

步骤s3-4,当该文件对象存在时就读取到对应的所述文件长度的内容信息,并将该内容信息封装到局部的字符串类型的变量中。

作为应对异常情况的一种方案,本实施例提供的电子设备在运行步骤s4时,其会分解运行以下的子步骤:

步骤s4-1,在读写函数的代码块中调用清理函数。

步骤s4-2,子线程向主线程发出内存清理的请求。

步骤s4-3,主线程回应请求,并调用清理函数对子线程进行清理来释放文件对象的资源信息。

实施例3

以下对本实例提供的存储介质进行详细说明。

一种存储介质,该存储介质上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现实现以下步骤的方法:

步骤s1,设置文件读写函数来对文件进行读写操作,该读写函数被设置为公有类型且具有文件路径这一参数。

步骤s2,根据文件路径对所述读写函数进行校验。

步骤s3,校验通过后开辟子线程进行读写操作。

步骤s4,关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源。

步骤s5,主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息。其中,主线程和子线程之间建立通信是依赖线程间通信工具handler来实现的。

进一步,作为一种优化,上述的步骤s3校验通过后开辟子线程进行读写操作具体包括以下的子步骤:

步骤s3-1,开辟子线程。

步骤s3-2,将所述读写函数中的文件路径转变为一个文件对象。

步骤s3-3,判断该文件对象是否存在,存在就进入下一步。

步骤s3-4,当该文件对象存在时就读取到对应的所述文件长度的内容信息,并将该内容信息封装到局部的字符串类型的变量中,否则就直接返回结束。

作为应对异常情况的一种方案,应用程序在运行步骤s4时,其会分解运行以下的子步骤:

步骤s4-1,在读写函数的代码块中调用清理函数。

步骤s4-2,子线程向主线程发出内存清理的请求。

步骤s4-3,主线程回应请求,并调用清理函数对子线程进行清理来释放文件对象的资源信息。

实施例4

图4为本发明的实施例中的自动释放文件资源的系统的结构示意图

以下结合附图4对本实施例提供的自动释放文件资源的系统100,用于实现文件读写并自动释放内存中的文件所占用的内存资源,其特征在于,包括:

读写函数设置模块101,其用于设置文件读写函数来对文件进行读写操作,该读写函数被设置为公有类型且具有文件路径和文件长度这两个参数。

校验模块102,用于对所述读写函数进行校验。

具体的该校验模块102包括以下四个功能单元:

第一单元1021,用于开辟子线程。

第二单元1022,用于将所述读写函数中的文件路径转变为一个文件对象。

第三单元1023,用于判断该文件对象是否存在,存在就进入下一步。

第四单元1024,用于当该文件对象存在时就读取到对应的所述文件长度的内容信息,并将该内容信息封装到局部的字符串类型的变量中。

读写操作模块103,用于在校验通过后开辟子线程进行读写操作。

内存释放模块104,用于关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源。

进一步的,作为应对异常情况的一种优化方案,内存释放模块104的功能被以下三个单元来完成:

清理函数调用单元1041,用于在读写函数的代码块中调用清理函数。

请求发送单元1042,用于子线程向主线程发出内存清理的请求。

文件释放单元1043,用于主线程回应请求,并调用清理函数对子线程进行清理来释放文件对象的资源信息。

通信模块105,用于在主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息。其中,主线程和子线程之间建立通信是依赖线程间通信工具handler来实现的。

实施例的作用与效果:根据本实施例所涉及的自动释放文件资源的方法,因为设置文件读写函数来对文件进行读写操作;对所述读写函数进行校验;校验通过后开辟子线程进行读写操作;关闭在读写操作中读取到的文件对象的文件流资源信息并释放文件对象所占用的内存资源;主线程和子线程之间建立通信来获取子线程中读取到的文件内容信息,也就是说,在子线程中使用读写函数进行读写操作,并在读写完成后将读取的文件对象所占用的内存资源进行清理,不会占用内存,然后将读取到的信息发送给主线程完成文件的读写过程,由于是通过子线程的读写函数来读写并立即消除内存,所以既能对文件进行读写,又不会因为读取大量的文件对象而导致文件对内存资源的占用,解决了内存泄漏的问题。

因为实施例是以安卓android为例的,其中使用的thread.start()函数来创建子线程、file.exists()函数来判断读写函数中的文件路径是否存在、filestream.close()来对子线程中被读取的文件进行边读取边释放的操作,而这些函数都是安卓android系统自带的函数,所以在实现过程中,程序代码容易实现,而且和安卓android系统具有较好的兼容性,减轻了后续程序代码调试的难度和工作量。

因为具有异常清理步骤,当读写出现异常时,对异常的文件进行提取并清理,这样的操作能够预防因为出现读写异常而出现的内存泄露情况的发生。

因为设置的清理函数是公有类型的,这样可以方便调用者具有调用该函数的权限。

进一步,因为在读写操作前,读写函数中的文件路径这个参数是否为空进行检测判断,所以能够避免对文件路径填写错误的文件读写请求进行的空处理,从而进一步的节省读写函数可能占据的内存空间。

在主线程和子线程之间线程间通信工具handler来建立通信,使用的是android自带的系统工具,具有更好的兼容性,不存在重新编写代码函数要面临的调试和兼容性问题。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1