首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用SAF / DocumentFile解压带有子目录的压缩文件?

SAF(Storage Access Framework)是Android系统提供的一种文件访问框架,可以用于访问设备上的文件和目录。DocumentFile是SAF框架中的一个类,用于表示文件和目录。

要使用SAF / DocumentFile解压带有子目录的压缩文件,可以按照以下步骤进行操作:

  1. 首先,使用SAF框架选择要解压的压缩文件。可以使用Intent.ACTION_OPEN_DOCUMENT或Intent.ACTION_OPEN_DOCUMENT_TREE来打开文件选择器,让用户选择要解压的文件或目录。
  2. 通过DocumentFile.fromSingleUri()或DocumentFile.fromTreeUri()方法,将用户选择的文件或目录转换为DocumentFile对象。
  3. 使用DocumentFile的getUri()方法获取文件或目录的URI。
  4. 通过ContentResolver的openInputStream()方法,打开文件的输入流。
  5. 使用Java的压缩库(如java.util.zip.ZipInputStream)读取压缩文件的内容。
  6. 遍历压缩文件中的每个条目,判断是否为目录。如果是目录,则创建相应的子目录。
  7. 如果是文件,则创建相应的文件,并将压缩文件中的内容写入到文件中。

以下是一个示例代码,演示了如何使用SAF / DocumentFile解压带有子目录的压缩文件:

代码语言:txt
复制
// 选择要解压的文件
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);

// 在onActivityResult方法中获取选择的文件URI
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri);

        // 打开文件的输入流
        try (InputStream inputStream = getContentResolver().openInputStream(documentFile.getUri())) {
            // 使用ZipInputStream读取压缩文件内容
            ZipInputStream zipInputStream = new ZipInputStream(inputStream);
            ZipEntry entry;
            while ((entry = zipInputStream.getNextEntry()) != null) {
                if (entry.isDirectory()) {
                    // 如果是目录,则创建相应的子目录
                    createDirectory(entry.getName());
                } else {
                    // 如果是文件,则创建相应的文件,并将内容写入到文件中
                    createFile(entry.getName(), zipInputStream);
                }
                zipInputStream.closeEntry();
            }
            zipInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 创建目录
private void createDirectory(String name) {
    // 创建相应的子目录
    File directory = new File(getFilesDir(), name);
    if (!directory.exists()) {
        directory.mkdirs();
    }
}

// 创建文件并写入内容
private void createFile(String name, InputStream inputStream) {
    // 创建相应的文件
    File file = new File(getFilesDir(), name);
    try (OutputStream outputStream = new FileOutputStream(file)) {
        // 将压缩文件中的内容写入到文件中
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, length);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是一个简单的示例,演示了如何使用SAF / DocumentFile解压带有子目录的压缩文件。在实际应用中,可能需要根据具体情况进行适当的修改和优化。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体引擎(GME):https://cloud.tencent.com/product/gme
  • 腾讯云音视频处理(VOD):https://cloud.tencent.com/product/vod
  • 腾讯云网络安全(SSL证书、DDoS防护等):https://cloud.tencent.com/product/safety
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android11 无Root 访问data目录实现、Android11访问data目录、Android11解除data目录限制、Android11 data空白解决

获取某个文件目录权限 方法很简单,使用android.intent.action.OPEN_DOCUMENT_TREE(调用SAF框架文件选择器选择一个文件夹)Intent就可以授权了 等下会放出工具类...(); 看名字就明白了,但是我们有的是一个文件夹uri,当然使用这个方法来生成DocumentFile对象,不同方法生成DocumentFile对象有不同效果,如果你用fromTreeUri生成默认是文件夹对象...刚刚开始我还以为是我生成URI不正确,但是当我尝试再次把我想获取子目录路径进行文件目录授权后,再用同一个URI生成DocumentFile对象却能指向正正确目录了。...解决方案 既然我们不能直接生成不了已授权目录子目录DocumentFile对象,那我能不能试试直接对应子路径生成DocumentFile对象(非treeUri),我们试试用fromSingleUri(...SAF方案缺点 很显然,通过SAF文件存储框架访问文件,速度和效率远远低于File API,因为SAF本来用途就不是用来解决Android11/data目录文件访问

12.8K31

【Mac 教程系列第 10 篇】如何在 Mac 上破解带有密码 ZIP 压缩文件

我们知道如果是一般压缩文件,可以用系统自带或者很好用压缩工具 Keka 来解压,但如果要解压压缩文件设置了密码,这个时候怎么做呢?...文章目录 一:下载 Homebrew 二:安装 fcrackzip 三:关于 fcrackzip 参数 四:如何使用 fcrackzip 解压带密码压缩文件 一:下载 Homebrew 你可以直接去...Homebrew 官网 下载,当然如果下载慢的话,我之前写了一篇关于如何下载 Homebrew 教程,可以 点击跳转 。...三:关于 fcrackzip 参数 在终端输入 fcrackzip -h 命令可以查看关于压缩时详细参数,如下图所示 参数后面都有详细说明,不再说明,下面直接说下如何使用,请看第四步。...四:如何使用 fcrackzip 解压带密码压缩文件 直接在终端输入一行代码就行 fcrackzip -b -c 'aA1' -l 1-10 -u 然后在后面跟上你要解压文件绝对路径(直接把你文件拖动到终端即可

21.8K32
  • Python中zipfile模块使用实例1 压缩文件基本信息2 解压文件

    1 压缩文件基本信息 导入模块 import zipfile 加载压缩文件,创建ZipFile 对象 class zipfile.ZipFile(file[, mode[, compression[...,也可以为'w'或'a',w'表示新建一个zip文档或覆盖一个已经存在zip文档,'a'表示将数据附加到一个现存zip文档中; 3.参数compression表示在写zip文档时使用压缩方法,它值可以是...zip文档,'a'表示将数据附加到一个现存zip文档中 # 参数compression表示在写zip文档时使用压缩方法,它值可以是zipfile....参数member指定要解压文件名称或对应ZipInfo对象;参数path指定了解析文件保存文件夹;参数pwd为解压密码。...参数members默认值为zip文档内所有文件名称列表,也可以自己设置,选择要解压文件名称。

    1.3K60

    如何使用带有DropoutLSTM网络进行时间序列预测

    在本教程中,您将了解如何在LSTM网络中使用Dropout,并设计实验来检验它在时间序列预测任务上效果。...完成本教程后,您将知道: 如何设计一个强大测试工具来评估LSTM网络在时间序列预测上表现。 如何设计,执行和分析在LSTM输入权值上使用Dropout结果。...如何设计,执行和分析在LSTM递归权值上使用Dropout结果。 让我们开始吧。...结果表明,我们应该在LSTM输入连接中适当使用Dropout,失活率约为40%。 我们可以分析一下40%输入失活率Dropout是如何影响模型训练时动态性能。...递归神经网络正则化方法 Dropout在递归神经网络中基础理论应用 利用Dropout改善递归神经网络手写字迹识别性能 概要 在本教程中,您了解了如何使用带有DropoutLSTM模型进行时间序列预测

    20.6K60

    LINUX学习笔记

    man:查询命令说明 格式:man 命令名称 退出按q locate:定位文件和目录【locate命令使用数据库来定位带有test这个词文件或目录】 格式:locate 文件或目录名字 whatis...格式:bunzip2 filename.bz2 gzip:gzip来压缩文件 格式:gzip filename -r:递归处理,指定目录及子目录一块处理 gzip -r file1 上面命令把file1...] 压缩: tar cvf xxx.tar(要压缩后文件名) 解压缩: tar xvf xxx.tar 在不进行解压情况下,显示压缩文件内容 tar tvf xxx.tar 使用tar和bzip2...来压缩/解压缩文件 tar -cjvf xxx.tbz(要压缩文件名) tar -xjvf xxx.tbz【解压缩】 使用tar和gzip来压缩/解压缩文件 tar -czvf xxx.tgz(要压缩文件名...压缩/解压缩文件(gz格式) -v:写入或读取时显示所有文件 -f:指定要展开归档文件名 -j:压缩或解压缩文件(bz2格式) ?

    1.2K30

    大数据之脚踏实地学05--Linux中解压与帮助命令

    因为你在互联网下载Linux安装文件几乎都是压缩文件,所以使用或安装之前也需要解压处理,当然你也会遇到将某个文件或目录压缩后发给其他同事情况。...本次分享将重点讲解Linux中压缩和解压缩命令,同时也会介绍如何查询常用命令帮助信息,进而便于Linux命令学习。...【注意点】: 1. gzip只能压缩文件,对于目录而言是不能压缩(但可以递归地压缩或解压缩目录内文件) 2. gzip在压缩完文件后,原文件是不被保留 【示例】:压缩文件 ?...如上图所示,在Screen目录内包含两个子目录和两个png文件,利用gzip命令可以对目录内文件和子目录文件进行递归压缩(必须使用-r选项),全都压缩为.gz格式。...【示例】:递归解压缩目录内文件 ? 如上图所示,通过gzip命令和-d选项就可以重新将压缩文件进行解压缩。

    61130

    压缩,解压参数:tar,zip,unzip,gzip, bzip2

    zip 命令常用选项及含义 选项 含义 -r 递归压缩目录,及将制定目录下所有文件以及子目录全部压缩。 -m 将文件压缩之后,删除原始文件,相当于把文件移到压缩文件中。...-d 对压缩文件进行解压缩。 -r 递归压缩指定目录下以及子目录所有文件。 -v 对于每个压缩和解压文件,显示相应文件名和压缩比。...gunzip 命令基本格式为: gunzip [选项] 文件 gunzip 命令常用选项及含义 选项 含义 -r 递归处理,解压缩指定目录下以及子目录所有文件。...bunzip2 命令使用和 gunzip 命令大致相同,bunzip2 命令只能用于解压文件,即便解压目录,也是解压该目录以及所含子目录所有文件。...bunzip2 命令基本格式为:bunzip2 [选项] 源文件 bunzip2 命令选项及含义 选项 含义 -k 解压缩后,默认会删除原来压缩文件。若要保留压缩文件,需使用此参数。

    1.3K10

    命令解压war包_tomcat war包不解压

    大家好,又见面了,我是你们朋友全栈君。 把java程序打成war包。起先用zip命令打包,起先可以用,后来却无法使用。今天找到一个更好办法。用jar命令,前提是要安装jdk。...,并不解压 -v 查看压缩文件详细信息,具体包括压缩文件中包含文件大小、文件名和压缩比等,并不解压 -n 解压时不覆盖已经存在文件 -o 解压时覆盖已经存在文件,并且不要求用户确认 -d 目录名...把压缩文件解压到指定目录下 同理zip命令也一样: -r 递归压缩,将指定目录下所有文件以及子目录全部压缩 -d 从压缩文件内删除指定文件 -i “文件列表” 只压缩文件列表中文件 -x “文件列表...4.我有一个很大压缩文件large.zip,我不想解压缩,只想看看它里面有什么: # unzip -v large.zip 5.我下载了一个压缩文件large.zip,想验证一下这个压缩文件是否下载完全了...# unzip -t large.zip 6.我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录

    2.3K20

    Linux常用命令-解压缩篇

    涉及参数说明: -c 建立新压缩文件 -r 添加文件到已经压缩文件 -u 添加改变了和现有的文件到已经存在压缩文件 -x 从压缩文件中提取文件 -t 显示压缩文件内容 -z 支持gzip解压文件...压缩 涉及参数说明: -d 从压缩文件内删除指定文件。 -f 此参数效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。...-r 递归处理,将指定目录下所有文件和子目录一并处理。 -u 更换较新文件到压缩文件内。 -v 显示指令执行过程或显示版本信息。...解开压缩文件 -r 递归处理,将指定目录下所有文件及子目录一并处理 -v 显示指令执行过程 tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。...总结 对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意是,空间和时间是需要根据实际应用进行权衡解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件

    3.4K20

    Linux命令篇(五):解压缩部分

    1、zip 命令 zip 命令用于压缩文件,压缩后文件后缀名为 .zip,基本语法入戏: zip [选项] [文件] 参数说明 -r:递归处理,将指定目录下所有文件和子目录一并处理 -q:不显示指令执行过程...[选项] [压缩文件] 参数说明 -c:将解压结果显示到屏幕上,并对字符做适当转换。....gz 解压缩文件解压缩一个gzip压缩文件,你可以使用-d选项 gzip -d testfile.gz 递归压缩目录 要递归地压缩一个目录中所有文件,你可以使用-r选项 gzip -r directoryname...-z:在创建或提取存档文件时使用 gzip 压缩算法来进行压缩或解压缩 -j:在创建或提取存档文件时使用 bzip2 压缩算法来进行压缩或解压缩 -C:指定 tar 命令工作目录 举例说明 创建tar...# 如果要将存档文件解压缩到不同目录,则可以使用 -C 选项指定目标目录,命令如下: tar -xvf etc_backup.tar -C /tmp 将tar存档类文件压缩为.gz结尾压缩文件使用

    9810

    Node zip压缩和解压

    使用非常简单方便。...-n 解压缩时不要覆盖原有的文件。 -o 不必先询问用户,unzip 执行后覆盖原有文件。 -P 使用 zip 密码选项。 -q 执行时不显示任何信息。...[文件] 指定要处理.zip 压缩文件哪些文件。 -d 指定文件解压缩后所要存储目录。 -x 指定不要处理.zip 压缩文件哪些文件。...-n 特定字符串 不压缩具有特定字尾字符串文件 -o 将压缩文件所有文件最新变动时间设为压缩时候时间 -q 安静模式,在压缩时候不显示指令执行过程 -r 将指定目录下所有子目录以及文件一起处理...不解压,只查看内容 unzip -v test.zip 验证 zip 文件完成性,查看网上下包包 是不是已经下载完了 unzip -t test.zip 我用-v 选项发现 music.zip 压缩文件里面有很多目录和子目录

    2.7K20

    linux zip 命令详解(2)

    [-i ][-x ]  补充说明:zip是个使用广泛压缩程序,文件经它压缩后会另外产生具有".zip"扩展名压缩文件。  参 数:  -A 调整可执行自动解压缩文件。 ...-f 此参数效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。  -F 尝试修复已损坏压缩文件。 ...-J 删除压缩文件前面不必要数据。  -k 使用MS-DOS兼容格式文件名称。  -l 压缩文件时,把LF字符置换成LF+CR字符。  -ll 压缩文件时,把LF+CR字符置换成LF字符。 ...-o 以压缩文件内拥有最新更改时间文件为准,将压缩文件更改时间设成和该文件相同。  -q 不显示指令执行过程。  -r 递归处理,将指定目录下所有文件和子目录一并处理。 ...-P 使用zip密码选项。 -q 执行时不显示任何信息。 -s 将文件名中空白字符转换为底线字符。 -V 保留VMS文件版本信息。 -X 解压缩时同时回存文件原来UID/GID。

    4.9K60

    如何解压war包_tomcat自动解压war包

    使用WinRAR即可解压,同目录下创建一个.zip文件,右键打开方式->WinRAR压缩文件管理器 “向上”,到文件目录 选择要解压文件,点击“解压到”,解压到你想要目录即可 java 中war格式压缩包怎么解压...java程序 解压war包,如何再压缩成war包? 不清楚war包格式。 可以随便找一个war包,然后把用压缩工具打开,把里面的内容全部删除,然后把你解压内容全部拖拽进去。...,推荐使用unzip解压war包。...-f 此 参数效果和指定”-u”参 数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。 -F 尝 试修复已损坏压缩文件。...-o 以 压缩文件内拥有最新更改时间文件为准,将压缩文件更改时间设成和该文件相同。 -q 不显 示指令执行过程。 -r 递 归处理,将指定目录下所有文件和子目录一并处理。

    3.2K10

    如何使用PQ获取目录下所有文件夹名(不含文件和子目录)

    今天想把之前发布Power BI示例文件文件夹做一个表出来,只获取该目录下所有文件夹名,并不包含其中各种文件和子目录。 ? 因为每个文件夹中都包含多个文件,甚至还有子文件夹: ?...所以如果直接用“从文件夹获取数据”方式,PowerQuery会使用Folder.Files函数: ? Folder.Files会将所选目录下所有文件路径罗列出来: ?...而且,其实用字符串多步骤切割方法,一是很繁琐, 二是容易后续出问题。 我觉得应该会有个稍微简单点操作。...以下是Folder.Contents说明: ? 这个就比较好了。它只返回所选目录下文件夹名和文件名,并不会返回子文件夹下文件。...再筛选TRUE行: ? 意思是查看属性,然后筛选那些是“目录”行。 这样,就将该目录下所有文件夹名获取到了。

    7K20
    领券