转自:http://byandby.iteye.com/blog/835671
在介绍如何在Android平台下进行文件的读取之前,有必要了解Android平台下的数据存储规则。在其他的操作系统如Windows 平台下,应用程序可以自由地或者在特定的访问权限基础上访问或修改其他应用程序名下的文件等资源,而在Android平台下,一个应用程序中所有的数据都是私有的。
openFileInput(String filename)
openFileOutput
fileList()
deleteFile(String fileName)
MODE_PRIVATE
MODE_APPEND
MODE_WORLD_READABLE
MODE_WORLD_WRITEABLE
本人刚开始把文件写入程序私有目录的时候用的是OpenFileOutput也就是上面介绍的第一种方法,但是很是费劲,因为返回的是fileoutputstream很多方法都没有(例如你写一个断点续传的功能就很麻烦)但是看到这篇文章后感觉既然可以用第一种方法来做那么我们可不可以直接用File file = new File();的方法来做呢,试了一下果然可以。然后回头想一想也很合理。你想啊私有目录是这个程序自己的目录我在自己的程序里访问自己的目录结果还不能访问需要这个那个的限制这也将不通啊,是吧,我访问公共的SD卡都没问题,访问自己的目录倒是有问题了,合理吗?呵呵,之前就是没试试啊。看来还是不能迷信常理,还是要多动手试试。
最近在研究Android断点续传的相关的技术. 这类文章在网上到处都是,基本原理都是在写入文件的时候在数据库中记录已经下载的文件大小. 当暂停后再次向服务器请求数据时传入这个数值,即可得到后续的数据. 然后调用RandomAccessFile这个对象的seek方法,在已经写入的文件中继续追加数据.
那么现在面临一个问题,那就是如果没有sdcard的时候,这个怎么处理?
熟悉Android的开发者都知道,如果想在应用中保存文件数据,除了可以在sdcard中写入,也可以在/data/data/packegename/file中保存。通常方法如下:
这样便会打开一个文件输出流进行文件的流写入操作. 但是这并不满足断电续传的要求,那就是FileOutputStream类并没有提供seek方法,所以不能在任意文件位置进行数据写入. 这对于断点续传技术来说是致命的.
如果直接使用如下代码进行强行文件写入是会报错的:
这会提示创建文件失败!
这是因为默认情况下,应用的数据目录是没有w权限的,只有读和修改的权限,所以无法创建新的文件.
重点来了,我们用下面的方法来曲线救国,请看代码:
第一步:在应用数据根目录下创建一个自定义的目录.
第二步:给此目录赋予可读写权限.
第三步:在此目录下创建任意文件.
以下是运行结果:
这样创建的文件就可以生成RandomAccessFile文件进行任意位置的读写操作了. 另外强调一下,这个方法无论手机是否拥有Root权限都是可行的. 希望对有需要的开发者们有帮助.