数据存储(2)---文件存储

来源:互联网 发布:承接工程项目软件 编辑:程序博客网 时间:2024/05/16 02:26

选择内部或者外部存储

内部存储:

(1)它总是可用的

(2)默认的文件保存在这里

(3)当卸载App的时候,文件会一起移除

外部存储:

(1)它不一定是可用的,如果没有外部存储,没有sd卡之类的,就不可用了。

(2)不能控制文件的安全性,因为是world-readable的

(3)卸载app时,它还是会存在的,除非我们保存数据的时候调用的是这个方法 getExternalFilesDir()(调用这个方法,卸载的时候,就一起卸载了哦)  


小诀窍:

虽然App默认的是内存储,但是我们可以在配置清单中用这个属性来定义它默认存储位置android:installLocation  


获得一个外部存储的权限

这种东西记不记无所谓,反正到时候会报错的,看到log日志,然后填写对应的权限即可了。

写的权限:

<manifest ...>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    ...</manifest>
有时候,我们不一定要写,但是如果要读取的话,就要读的权限:

<manifest ...>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    ...</manifest>


保存一个文件到内部存储中

获得路径:

getFilesDir()  返回当前应用程序的内部路径的一个目录。

getCacheDir() 内部存储中当前路径的缓存目录。如果内存不足,直接清除一些缓存的文件。

例子:创建一个内部存储的文件:

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

或者是这样:调用openFileOutput()  来获得一个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();}
或者是创建缓存文件:

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的内部存储的位置是固定的,就是我们的包名定义的。其他App想要访问我们必须知道我们的包名,还有我们的文件不能是私有的,如果我们的文件定义为MODE_PRIVATE的话,那么,其他的app也是不能访问的。


保存一个外部存储的文件
我们要先判断是否有没有这个外存储设备。例子:

/* Checks if external storage is available for read and write */public boolean isExternalStorageWritable() {    String state = Environment.getExternalStorageState();    if (Environment.MEDIA_MOUNTED.equals(state)) {        return true;    }    return false;}/* Checks if external storage is available to at least read */public boolean isExternalStorageReadable() {    String state = Environment.getExternalStorageState();    if (Environment.MEDIA_MOUNTED.equals(state) ||        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {        return true;    }    return false;}

虽然外部存储被用户和其他应用程序修改,但是我们也还是可以保存成这样的两种文件:

Public files: 见名知意,大家都能用的,卸载的时候,它还是在滴

Private files:卸载的时候,自动移除的。

如果是想保存成Public的文件的话,可以用这个方法 getExternalStoragePublicDirectory() 来获得共有的路径。比如 DIRECTORY_MUSIC 或者是 DIRECTORY_PICTURES :

public File getAlbumStorageDir(String albumName) {    // Get the directory for the user's public pictures directory.     File file = new File(Environment.getExternalStoragePublicDirectory(            Environment.DIRECTORY_PICTURES), albumName);    if (!file.mkdirs()) {        Log.e(LOG_TAG, "Directory not created");    }    return file;}

保存一个Private的文件用getExternalFilesDir()方法

public File getAlbumStorageDir(Context context, String albumName) {    // Get the directory for the app's private pictures directory.     File file = new File(context.getExternalFilesDir(            Environment.DIRECTORY_PICTURES), albumName);    if (!file.mkdirs()) {        Log.e(LOG_TAG, "Directory not created");    }    return file;}

如果预先定义的子目录的名称不适合我们的文件,我们可以用getExternalFilesDir() 传入一个null的参数。它将会返回外部存储的根路径


查询空闲的空间

获得剩余的存储空间和总的存储空间:

getFreeSpace()   getTotalSpace() 


删除文件

myFile.delete();

或者这样:

myContext.deleteFile(fileName);

记住!!!

当我们卸载app的时候,Android系统会删除这些文件:

(1)所有我们保存的内部存储文件。

(2)所有我们使用 getExternalFilesDir() 方法的外部存储文件。

我们应该有规律的手动的删除所有的缓存文件,还有有规律的手动删除那些我们不会再用到的文件。




0 0
原创粉丝点击