【问题标题】:Loading files within android在android中加载文件
【发布时间】:2011-10-21 18:50:46
【问题描述】:

Android 似乎让加载某些类型的资源变得非常容易。一旦我离开了人迹罕至的地方,它似乎就没有多大帮助了。当且仅当它们属于某些类型时,我才能从资产文件夹中加载图像、声音和其他对象。如果我尝试加载我自己格式的二进制文件,我会得到一个不太有用的“找不到文件”异常,即使列出目录表明它显然存在。

我尝试使用以下方法从 assets 目录中读取自定义格式的二进制文件:

File jfile = new File("file://android_asset/"+filename); //tried to get the URI of the assets folder
JarFile file = new JarFile("assets/"+filename); //tried assuming the assets folder is root
fd = am.openNonAssetFd( filename); //tried getting my file as an non asset in the assets folder (n.b. it is definitely there)
fs = am.open(filename, AssetManager.ACCESS_BUFFER); //tried loading it as an asset

我在想关于 android 文件 I/O 的一些基本知识我还不明白。资产管理的文档似乎不完整,一定有一些理由故意使这个不直观(与安全有关?)。那么,在 Android 应用程序中加载我自己格式的二进制文件的最简单、规范的方法是什么?

更新:

我尝试了 file:///android_asset/ 但仍然没有乐趣。

String fullfilename = "file:///android_asset/"+filename;
File jfile = new File(fullfilename);
if (jfile.exists())
{
    return new FileInputStream(jfile);
}
else
{
return null;  //the file does exist but it always says it doesn't. 
}

是否有我需要的文件或项目清单中的任何权限?

谢谢

【问题讨论】:

  • 定义“我自己格式的二进制文件”?你在说什么?
  • 嗨。我不确定如何更具体。我有一个充满数据的文件;在本例中,是我编写的编辑器输出的 3D 模型。数据的格式是我自己定义的——也就是说,文件中字节的顺序是我选择的格式。 4 个标头字节、材质信息、作为 IEEE 4 字节浮点数的顶点以及位置、颜色、纹理坐标等。之后是多边形索引、动画数据等。不过这并不重要——重要的是我从资产(或任何其他)文件夹中获取这些字节并进入内存。

标签: java android file io android-assets


【解决方案1】:

我认为从 Assets 文件夹加载文件的最佳方法是使用 AssetManager.open(String filename) - 这会返回一个 InputStream,然后您可以将其包装在 BufferedInputStream 中,否则调用 read() 来获取字节。无论文件类型如何,这都会起作用。您具体使用这种方法遇到了哪些问题?

【讨论】:

  • 它返回一个 fileNotFoundException,即使它确实存在。我想知道“文件名”的形式是否正确,但我尝试过的所有渗透都没有运气(file.ext、file:\\\file.ext、assets\file.ext 文件:\\\anroid_asset\file.ext 等)
  • 我只是将它与 'file.ext' 一起使用,即 am.open("file.ext");。奇怪的是,在这种情况下它对你不起作用!尝试调用 am.list("");获取它认为在您的资产文件夹中的文件列表。
  • 也这样做了(列出了文件),是的,这很奇怪。也许程序中的其他地方发生了一些奇怪的事情,导致以后出现问题。很高兴知道 open(file) 对其他人有用,这给了我一些目标。你试过二进制文件吗?
  • 嗯,现在可以了。我不确定与最初尝试“打开”时有什么不同,但我没有将其包装在“BufferedInputStream”中,所以也许这就是关键。无论如何,谢谢!
  • 我从一开始就将它包装在 BufferedInputStream 中。那不是解决方案,请阅读我的答案。
【解决方案2】:

我认为你已经省略了斜线

File jfile = new File("file:///android_asset/"+filename);

有三个正斜杠,而不是两个。 :)

【讨论】:

  • 您好,感谢您的回答。它看起来当然是正确的,但对我来说仍然没有骰子。
  • 这似乎表明我无法使用 new File() 从 assets 文件夹加载文件。如果没有,有什么替代方案? stackoverflow.com/questions/5981176/…
  • 这个结构不接受权威,“android_asset”就是这样。
【解决方案3】:

对我来说,解决方案是卸载应用程序,在 Eclipse 中清理项目并再次运行它。问题是 Android 找不到我放在资产文件夹中的新文件。 我最终阅读了这个问题,所以我希望这对其他人有帮助。

【讨论】:

  • 无需执行所有这些操作 - 只需右键单击“资产”树项并选择刷新。
猜你喜欢
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2014-09-11
  • 2015-05-27
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多