android File的知识点一网打尽。

来源:互联网 发布:硕鼠 mac 打不开 编辑:程序博客网 时间:2024/05/05 16:35

                                              存储Files 

Android的File系统和其他平台上基于硬盘的File系统一样,Android官方文档表情,File适用于读取不能中断的大量数据。例如从网络上获取的数据(图片文件)


 所有的Android设备都有2个存储空间,内部空间(internal)和外部空间(external),因为android早期系统的关系,不管怎么说,android的设备都具有2个存储空间,即外部空间和内部空间。

1.内部空间的特点:
   a.它总是可访问的.(并且不需要任何权限声明)
   b.默认情况下存储在此的File只能由你的app访问,其他访问不了,保存文件的时候可以申请让其他软件可访问。
   c.当用户删除了该应用,这些文件会被自动删除。

2.外部空间的特点:
   a.并不是总是可访问的。
   b.你保存的文件可能会被外部访问。
   c.只有当你把文件存储到 getExternalFilesDir().获取的路径下,应用卸载时才会自动删除该目录下的文件。否则不会自动删除应用中的文件。

注意:尽管应用会默认的安装在内部空间中,但是你可以通过指定

android:installLocation 属性值将你的app安装到外部空间中。

一般应用占用的空间较大 可以通过此属性将文件 移动到外部空间中去。



             A.对于外部存储设备拥有权限

<manifest ...>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    ...</manifest>
如果只有读的操作可以只声明 
<manifest ...>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    ...</manifest>
写操作权限默认包含读操作的权限,你不需要为了内部空间的读写操作声明任何权

限,因为这是默认就有的。



                  B.存储到内部空间

1.调用getFileDir()方法。

2.调用getCacheDir()方法

注意:这只是个临时的存储空间,当文件不需要的时候应该手动删除,而且

应该限制该文件夹下的存储容量。最好不要超过这上限值。例如设置上限值为1MB。

以免当系统内存过低时,该文件下的内容会被没有提示的情况

下被删除。


你可以通过 
File file = new File(context.getFilesDir(), filename);
指定自己的内部文件目录,获取


你可以通过openFileOutput() to get a FileOutputStream 

然后写入你的内部存储空间中

例如:

String filename = "myfile";String string = "Hello world!";FileOutputStream outputStream;try {  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);  outputStream.write(string.getBytes());  outputStream.close();} catch (Exception e) {  e.printStackTrace();}
如果你想缓存一些文件到内部缓存路径下,你应该使用createTempFile()。例如:

public File getTempFile(Context context, String url) {    File file;    try {        String fileName = Uri.parse(url).getLastPathSegment();        file = File.createTempFile(fileName, null, context.getCacheDir());    catch (IOException e) {        // Error while creating file    }    return file;}
创建一个指定的文件名的文件在你的内部缓存目录下。

内部存储空间的目录名是你的app的包名。如果将文件的模式设置为writeable或者

readable那么其他的app就可以通过 具体的文件路径访问你的文件了,如果设置成

MODE_PRIVATE ,将不能访问你的文件。
                        

                  C.存储到外部空间

因为外部空间不总是可获取的,所以我们使用前应该先判断其他状态,可以通

 getExternalStorageState()
 
1.public dir:该目录下面的文件不会随着app的卸载而消亡,其他的app也可访问。

用getExternalStoragePublicDirectory() 获取public dir.

2.private dir:当应用被卸载该目录下的文件也会删除。
用getExternalFilesDir()获取private dir. 用系统提供的常量如:DIRECTORY_RINGTONES获取文件 会被当做系统文件处理。

                                          d.获取空闲的大小。
可以使用getFreeSize(),或者getTotalSize()获取可用的大小,和总大小。
如果不清楚大小,也可以通过捕捉IO。Exceltion异常来判断。


                                         e.删除文件
可以通过file.delte()删除文件。
如果文件是存储在内部空间中,可以使用Context对象的 deleteFile(String name)方法
myContext.deleteFile(fileName);
来删除文件。

最好请注意:

    当app被卸载时,有2部分的内容可能被自动清除。
    
1.内部空间的内容

2.外部空间位于getExternalFilesDir()目录下的内容。

 还有就是请定期手动的删除用getCacheDir()创建的文件和定期删除其他已经不再需要的文件。


       





0 0
原创粉丝点击