【问题标题】:File object from Inputstream来自 Inputstream 的文件对象
【发布时间】:2015-09-23 14:51:55
【问题描述】:

我想在我的安卓应用中应用 zip4j。我将演示 zip 文件放入资产文件夹 (main/assets/test.zip)。我想用 zip4j 打开它:

import net.lingala.zip4j.core.ZipFile;
...
ZipFile zipFile = new ZipFile(new File("an/absolute/path/is/required"));

但是,应用 zip4j 所需的构造函数需要 String 对象(文件的绝对路径)或 File 对象。但是 Android 的 AssetManger 只返回一个InputStream。也请不要:AssetManger 确实提供绝对路径或其他东西。

那么,我需要做什么才能将InputStream is = getResources().getAssets().open(filename); 的输入流转换为java.io.File 对象,然后我可以将其应用于ZipFile

【问题讨论】:

  • file:///android_asset/ 是资产目录的绝对路径。
  • 我已经试过了。它不起作用。
  • zip 文件位于 assets 文件夹中的任何特殊原因?您是否打算最终以这种方式将一个与您的应用程序捆绑在一起?也许将 zip 文件下载/复制到本地存储(然后您可以从中获取File)也是一种选择?或者,查看 Android SDK 附带的 java.util.zip.ZipInputStream:它充当任何 InputStream 的包装器,这意味着您可以直接将其与 getAssets().open(...) 的结果一起使用。
  • 是的,ZipInputStream 正是我目前使用的。 Zip4j 可能不建议在 Android 项目中使用
  • 为什么?除了java.util.zip,这个包还提供什么?

标签: android zipfile zip4j


【解决方案1】:

处理资产时相当常见的任务:

  1. 从 AssetManager 获取 AssetFileDescriptor:openFD(String fileName)。
  2. 从该 AssetFileDescriptor 获取 FileDescriptor:getFileDescriptor()
  3. 从 FileDescriptor 构造一个新文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 2012-06-20
    • 2014-04-19
    • 2011-12-03
    • 2012-09-02
    • 2018-11-20
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多