【问题标题】:Android read file from assets by FileInputStream [duplicate]Android通过FileInputStream从资产中读取文件[重复]
【发布时间】:2015-05-18 15:26:57
【问题描述】:

我知道我可以使用AssetManager 从资产中读取文件,就像这里

AssetManager assetManager = getAssets();
InputStream is = assetManager.open(filename)

但是open() 方法返回InputStream。所以当我需要使用 FileInputStream 而不是它的超类时,我应该怎么做。有没有办法通过InputStream 实例获取FileInputStream 实例?

【问题讨论】:

  • 你想读什么样的文件?是文本、图像、音频、视频、sqlite db 吗?
  • @RajenRaiyarela 文本文件

标签: android io


【解决方案1】:

不,没有办法将任意 InputStream 转换回 FileInputStream,因为数据源可能具有不同的性质 - 不是文字文件。

资产不是设备上的文件,而是 zip 文件的特定块,即您的 .apk。资产 API 为您提供了在许多方面类似于文件的访问(特别是关于输入流),但最终不会包装单个 java.io.File,而是直接从 .apk 提取数据的引擎

【讨论】:

  • 除了 NDK 库本身的二进制形式之外,实际上并没有一种机制可以在 APK 中打包“文件”以在设备上显示为“文件”——只有资产和资源具有他们自己的 API 进行访问。对于数据库,人们有时会这样做,并在第一次运行时复制到文件中。
  • 通常不会。只有在安装前卸载、切换到具有不同签名的版本或明确清除应用数据时,系统才会清除应用的存储文件夹。当然data/data/files 是一个无效路径——你应该在你的活动或服务上调用getFilesDir()
  • 没有任何东西(除了 NDK 库)会被自动解包,但是你在运行早期版本的应用程序时明确写在你的私人文件夹中的任何东西通常仍然存在,只要你没有卸载,清除数据,或更改证书(例如在调试和发布之间)。
  • 当您想处理自己在运行时创建的文件时,可以。这与打包在 .apk 中的资产或资源完全不同,出于实际目的,您必须使用其独特的非文件 API 来访问它们。在某些情况下,您可能希望在第一次运行时将后者复制到前者,例如,在 .apk 中提供初始数据的可写数据库。
  • 项目源中没有“files”目录,该目录将包含在设备上安装的包中。如果你想在你的 apk 中包含数据,你必须使用提供的机制之一。
【解决方案2】:

在这种情况下,您可以创建一个 StringBuilder 并在其中读取文本文件的全部内容,如下所示

StringBuilder buf=new StringBuilder();
InputStream is=getAssets().open(filename);
BufferedReader in= new BufferedReader(new InputStreamReader(is, "UTF-8"));
String str;

while ((str=in.readLine()) != null) {
     buf.append(str);
}

in.close();

注意:根据您尝试访问的文件类型,情况会有所不同;正如 Chris Stratton 所写,因为数据源可能具有不同的性质。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 2016-04-25
    • 2018-09-20
    • 2012-03-21
    • 2018-11-14
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多