android学习(三) 保存文件

来源:互联网 发布:化工专业英语翻译软件 编辑:程序博客网 时间:2024/06/01 10:02

所有Android设备都有两个文件存储区域:”内部”和”外部”存储。
内部存储
1. 它始终可用。
2. 只有您的应用可以访问此处保存的文件。
3. 当用户卸载您的应用时,系统会从内部存储中移除您的应用的所有文件。
外部存储
1. 他并非使用可用,因为用户可采用USB存储设备的形式装载外部存储,并在某些情况下会从设备中将其移除。
2. 它是全局可读的,因此此处保存的文件可能不受您控制地被读取。
3. 当用户卸载您地应用时,只有您通过getExternalFilesDir()将您的应用的文件保存在目录中时,系统才会从此处移除您的应用的文件。
:对于无需访问限制以及您希望与其他应用共享或允许用户使用计算机访问的文件,外部存储是最佳位置。
提示:尽管应用默认外部在内部存储中,但您可在您的清单文件中指定android:installLocation属性

将文件保存在内部存储中

在内部存储中保存文件时,您可以通过调用一下两种方法之一作为File的相应目录:

getFilesDir() 返回表示您的应用的内部目录的File getCacheDir() 返回表示您的应用临时缓存文件的内部目录的 File。 务必删除所有不再需要的文件并对在指定时间您使用的内存量实现合理大小限制,比如,1MB。 如果在系统即将耗尽存储,它会在不进行警告的情况下删除您的缓存文件

如果要在这些目录之一新建文件,可以使用File()构造函数。

File file = new File(context.getFilesDir,fileName);File file = new File(context.getCacheDir,fileName);

也可以调用openFileOutput()获取写入到内部目录中的文件的FileOutputStream

String fileName = "myFile";String s = "hello world";FileOutputStream fileOutputStream;try {    fileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE);    fileOutputStream.write(s.getBytes());    fileOutputStream.close();} catch (FileNotFoundException e) {    e.printStackTrace();} catch (IOException e) {    e.printStackTrace();}

如果需要缓存某些文件时,应改用createTempFile()

public File getTempFile(Context context, String url){        File file = null;        try {            String fileName = Uri.parse(url).getLastPathSegment();            file = File.createTempFile(fileName, null, context.getCacheDir())//第一个参数是文件前缀,第二个参数是文件后缀。        } catch (IOException e) {            e.printStackTrace();        }        return file;    }

将文件保存在外部存储中

由于外部存储可能不可用,可以通过调用getExternalStorageState()查询外部存储状态。如果返回的状态为MEDIA_MOUNTED,那么就可以对您的文件进行读写。

//检查外部存储是否可用于读写    public boolean isExternalStorageWritable(){        String state = Environment.getExternalStorageState();        if(Environment.MEDIA_MOUNTED.equals(state)){            return true;        }        return false;    }//检查外部存储是否可用至少读取    public boolean isExternalStorageReadable(){        String state = Environment.getExternalStorageState();        if(Environment.MEDIA_MOUNTED.equals(state)||        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){            return true;        }        return false;    }

外部文件也可设为公共文件和私有文件。
公共文件
应供其他应用和用户自由使用的文件。 当用户卸载您的应用时,用户应仍可以使用这些文件。例如,您的应用拍摄的照片或其他已下载的文件。
私有文件
属于您的应用且在用户卸载您的应用时应予删除的文件。 尽管这些文件在技术上可被用户和其他应用访问(因为它们存储在外部存储中), 但它们实际上不向您的应用之外的用户提供任何输出值。 当用户卸载您的应用时,系统会删除应用外部私有目录中的所有文件。
例如,您的应用下载的其他资源或临时介质文件。


如果您要将公共文件保存在外部存储设备中,请使用getExternalStoragePublicDirectory() 方法获取表示外部存储设备上相应目录的File。该方法使用指定您想要保存以便它们可以与其他公共文件在逻辑上组织在一起的文件类型的参数,比如 DIRECTORY_MUSIC DIRECTORY_PICTURES

//获取相册存储目录public File getAlbumStorageDir(String albumName){    File file = new File(Environment.getExternalStoragePublicDirectory(    Environment.DIRECTORY_PICTURES),albumName);    if(!file.mkdirs()){        Log.e("文件错误","文件创建失败");    }    return file;}

如果您要保存您的应用专用文件,您可以通过调用 getExternalFilesDir() 并向其传递指示您想要的目录类型的名称,从而获取相应的目录。通过这种方法创建的各个目录将添加至封装您的应用的所有外部存储文件的父目录,当用户卸载您的应用时,系统会删除这些文件。

public File getAlbumStorageDir(Context context, String albumName){    File file = new File(context.getExternalFilesDir(    Environment.DIRECTORY_PICTURES),albumName);    if(!file.mkdirs()){        Log.e("文件错误","文件创建失败");    }    return file;}

如果没有适合的文件的预定义子目录名称,可以调用getExternalFilesDir() 并传入null。这将返回外部存储上您的应用的专用目录的根目录。


查询可用空间

方法 解释 getFreeSpace() 目前的可用空间 getTotalSpace() 存储卷中的总空间

删除文件

您应始终删除不再需要的文件。删除文件最直接的方法是让打开的文件参考自行调用 delete()。

myFile.delete();

如果文件保存在内部存储中,您还可以请求 Context 通过调用 deleteFile() 来定位和删除文件:

myContext.deleteFile(fileName);

注:当用户卸载您的应用时,Android 系统会删除以下各项:
您保存在内部存储中的所有文件
您使用 getExternalFilesDir() 保存在外部存储中的所有文件。
但是,您应手动删除使用 getCacheDir() 定期创建的所有缓存文件并且定期删除不再需要的其他文件。
摘自android developer

0 0
原创粉丝点击