作者:华清远见讲师

所有的Android设备均有两个文件存储区域:"internal" 与 "external" 。 这两个名称来自于早先的Android系统,当时大多设备都内置了不可变的内存(internal storage)及一个类似于SD card(external storage)这样的可卸载的存储部件。之后有一些设备将"internal" 与 "external" 都做成了不可卸载的内置存储,虽然如此,但是这一整块还是从逻辑上有被划分为"internal"与"external"的。只是现在不再以是否可卸载进行区分了。 下面列出了两者的区别:


Internal storage:

1.总是可用的

2.这里的文件默认只能被我们的app所访问。

3.当用户卸载app的时候,系统会把internal内该app相关的文件都清除干净。

4.Internal是我们在想确保不被用户与其他app所访问的最佳存储区域。

External storage:

1.并不总是可用的,因为用户有时会通过USB存储模式挂载外部存储器,当取下挂载的这部分后,就无法对其进行访问了。

2.是大家都可以访问的,因此保存在这里的文件可能被其他程序访问。

3.当用户卸载我们的app时,系统仅仅会删除external根目录(getExternalFilesDir())下的相关文件。

4.External是在不需要严格的访问权限并且希望这些文件能够被其他app所共享或者是允许用户通过电脑访问时的最佳存储区域。

保存文件到External storage:

为了写数据到external storage, 必须在你manifest文件中请求WRITE_EXTERNAL_STORAGE权限:

...

因为external storage可能是不可用的,比如遇到SD卡被拔出等情况时。因此在访问之前应对其可用性进行检查。我们可以通过执行 getExternalStorageState()来查询external storage的状态。若返回状态为MEDIA_MOUNTED, 则可以读写。

保存文件到Internal storage:

保存文件到internal storage时,可以通过执行下面两个方法之一来获取合适的目录作为 FILE 的对象:

getFilesDir() : 返回一个File,代表了我们app的internal目录。

getCacheDir() : 返回一个File,代表了我们app的internal缓存目录。请确保这个目录下的文件能够在一旦不再需要的时候马上被删除,并对其大小进行合理限制,例如1MB 。系统的内部存储空间不够时,会自行选择删除缓存文件。

同样可以使用File() 构造器在那些目录下创建一个新的文件,如下:

File file = new File(context.getFilesDir(), filename);

之后我们就可以通过IO流对文件进行读写操作了。