Android对于外置TF卡的读写操作(读写外置SD卡)

上一篇介绍如何获得权限uri

在获得权限uri后,我们也不能直接对外卡直接操作,可以通过documentFile来进行,创建,添加修改和删除等操作.documentFile创建文件的过程可能与以往的File不同,它是通过mimeType和displayName来表示文件的创建的.

在使用之前,我们要知道这是一个模拟File的程序类,它提供了文档树的模式,所以它会有很大的开销,为了节省我们的空间,我们要确定是不是要访问整个文档树,最小特权原则规定只应要求访问真正需要的文档。如果只需要用户选择单个文件,使用ACTION_OPEN_DOCUMENT或 ACTION_GET_CONTENT。如果想让用户选择多个文件,添加EXTRA_ALLOW_MULTIPLE。如果只需要用户保存单个文件,使用ACTION_CREATE_DOCUMENT。如果使用这些API,可以通过产生的getData()成 fromSingleUri(Context, Uri)与文档工作。

如果确实需要完全访问整个文档子树,首先启动ACTION_OPEN_DOCUMENT_TREE以允许用户选择目录。然后,通过所产生的getData()进入 fromTreeUri(Context, Uri)开始与用户选择的树工作。

在导航DocumentFile实例树时,始终可以使用 getUri()获取表示该对象的基础文档的Uri,以便与之一起使用openInputStream(Uri)等。

创建文件

fromTreeUri(Context,Uri)可以帮助我们使用已经得到的uri创建documentFile对象.

fromSingleUri(Context, Uri)创建的是单个文档对象

documentFile = DocumentFile.fromTreeUri(this, uri);

使用createFile(String mimeType, String displayName)来创建文件,比如我们要创建一个111.txt的文本文档.

DocumentFile newFile = documentFile.createFile("text/plain", "111");

传入不同的mimeType来创建不同类型的文件,例如image/png或 audio/flac.displayName参数就是文件名,这样的话documentFile就会帮助我们创建相应类型的文件.

注:因为我获得uri权限是sd卡完整权限,所以创建文件的位置是卡的跟目录.能使用uri就用uri,不要documentFile一层套一层,很浪费资源的.

编辑文件

getContentResolver().openOutputStream(Uri uri)可以帮助我们得到创建完文件的数据流,可以直接对其进行写入操作.

        OutputStream out = null;
        try {
            out = getContentResolver().openOutputStream(newFile.getUri());
            out.write("A long time ago...".getBytes());
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

查找文件

findFile(String displayName)能够查找到当前树下第一个匹配到的displayName名称的文件,已documentFile的形式返回.

DocumentFile file = documentFile.findFile("221111.txt");

删除文件

documentFile有delete()方法来删除文件

newFile.delete();

获得文件名

getName()能够得到当前documentFile的文件名

Log.e(TAG, "newFile.getName();: "+newFile.getName());

获得文件Uri

getUri()能够得到当前documentFile的Uri

Log.e(TAG, "newFile.getUri();: "+newFile.getUri());

获得文件类型(MIME类型)

getType()能够获得当前documentFile的MIME类型,例如image/png或 audio/flac

Log.e(TAG, "newFile.getType();:"+newFile.getType());

创建文件夹

createDirectory(String displayName)能够在当前documentFile树下创建名称为displayName的文件夹

    private void createDir(DocumentFile documentFile) {
        DocumentFile testDir = documentFile.createDirectory("testDir");
    }

获得文件的父文件

getParentFile()能够获得当前文件的父文件

Log.e(TAG, "newFile.getParentFile();: "+newFile.getParentFile());

查看是否是目录/文件

isDirectory()和isFIle()返回boolean,能够判断此documentFile是否是目录/文件

        boolean directory = documentFile.isDirectory();
        boolean file = documentFile.isFile();

获得目录下所有文件

listFiles()能够获得此目录数下的所有文件,已DocumentFile数组的形式返回

DocumentFile[] documentFiles = documentFile.listFiles();

重命名文件

renameTo(String displayName)能够重命名文件

boolean renameFile = newFile.renameTo("renameFile");

                                            over

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值