Android - 从资产中读取文本文件似乎在实际数据之前/之后包含大量垃圾?
我将一个文本文件与我的 Android 应用程序(在资产中)打包在一起,我在应用程序本身中读取该文本文件。
为了避免该文件被压缩,它被命名为“mytestfile.mp3”,直到最近,它都工作得很好。
在最近的 SDK/ADT 更改之一中,从资产读取时似乎发生了一些“奇怪”的事情,我对它是什么持开放态度......
我使用类似这样的代码
AssetFileDescriptor descriptor = getAssets().openFd("mytextfile.mp3");
BufferedReader f = new BufferedReader(new FileReader(descriptor.getFileDescriptor()));
String line = f.readLine();
while (line != null) {
// do stuff
Log.d("TAG",line);
}
我现在看到的日志相当奇怪 - 如果文件包含这样的内容,
Fred
Barney
Wilma
我会在日志中看到大量这样的废话
��ߴ�!�c�W���6�f����m�>ߩ���'�����6�#6���l0��mp�
- 最终是我的文本内容,
Fred
Barney
Wilma
然后是另一公吨的乱码 - 其中一些看起来像
����������4�u?'����������������������������������������res/drawable-mdpi/icon.pngPK��������|v?,������������'�����������������������������res/layout-land/dialog_color_picker.xmlPK��������|v?1�!�����t2�������������������������������classes.dexPK��������|v?թVڝ����5���������������������������������META-INF/MANIFEST.MFPK��������|v?�v������j���������������������������������META-INF/CERT.SFPK��������|v?W7@�]�������������������������������������META-INF/CERT.RSAPK������������������������
这样看,这似乎是原始的APK 中的二进制内容(与文本文件无关)?
这是最近的包装问题还是我遗漏了什么?我正在使用 ADT15,但我还没有尝试最近的升级!?
ps 我已经升级到最新的 SDK/ADT,但这个问题仍然存在 - 显然我想将其升级到有问题的人(不知道问题是 Eclipse/ADT/ANT 还是以 Android 为中心),所以我会开始为创意提供赏金……
I package a text file with my Android App (in Assets) which I read within the App itself.
To avoid this file being compressed, it's named 'mytestfile.mp3' and until recently, that worked just fine.
In one of the recent SDK/ADT changes, it seems something 'odd' is happening when reading from Assets and I'm open to ideas as to what it is...
I use code something like this
AssetFileDescriptor descriptor = getAssets().openFd("mytextfile.mp3");
BufferedReader f = new BufferedReader(new FileReader(descriptor.getFileDescriptor()));
String line = f.readLine();
while (line != null) {
// do stuff
Log.d("TAG",line);
}
What I'm now seeing from the Log is rather odd - if the file contained something like this
Fred
Barney
Wilma
I'm seeing huge amounts of nonsense like this in the log
��ߴ�!�c�W���6�f����m�>ߩ���'�����6�#6���l0��mp�
followed - eventually by my text content
Fred
Barney
Wilma
followed by another metric tonne of gibberish - some of which looks like this
����������4�u?'����������������������������������������res/drawable-mdpi/icon.pngPK��������|v?,������������'�����������������������������res/layout-land/dialog_color_picker.xmlPK��������|v?1�!�����t2�������������������������������classes.dexPK��������|v?թVڝ����5���������������������������������META-INF/MANIFEST.MFPK��������|v?�v������j���������������������������������META-INF/CERT.SFPK��������|v?W7@�]�������������������������������������META-INF/CERT.RSAPK������������������������
As you can see, that appears to be raw binary content from the APK (and nothing to do with the text file)??
Is this a recent packaging issue or am I missing something? I'm using ADT15 but I've not tried the recent upgrade just yet!?
p.s. I've upgraded to the latest SDK/ADT and this problem persists - obviously I'd like to escalate it with whoever is at fault (no idea if the problem is Eclipse/ADT/ANT or Android centered) and so I'll start a bounty for ideas...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是因为
AssetFileDescriptor.getFileDescriptor()
适用于您的 .apk,而不是 .apk 内的mytextfile.mp3
文件。要使用AssetFileDescriptor
,您还需要考虑AssetFileDescriptor.getStartOffset()
,它是实际文件的偏移量,即mytextfile.mp3 在你的情况下。
但有一个简单的方法可以解决您的问题。请改用
AssetManager.open(String)
,这将为您提供mytextfile.mp3
文件的InputStream
。像这样:This is because
AssetFileDescriptor.getFileDescriptor()
is for your .apk and not themytextfile.mp3
file inside the .apk. To work withAssetFileDescriptor
you need to take e.g.AssetFileDescriptor.getStartOffset()
into account as well, which is the offset to the actual file i.e.mytextfile.mp3
in your case.But there's an easy solution to your problem. Use
AssetManager.open(String)
instead, which will give you anInputStream
to themytextfile.mp3
file. Like this:Eclipse/ADT 有时会导致资源损坏。尝试清理并重建项目,看看是否可以解决问题。
Eclipse/ADT occasionally gets the resources corrupted. Try doing a project clean and rebuild to see if that fixes it.
我的应用程序也遇到了同样的问题。尝试使用 Apache Commons IO
FileUtils
。这会为您的 apk 增加 100kb,但会使文件处理变得更加容易。
如果将文件存储为
myfile.txt
而不是.mp3
,它会给出相同的输出吗?您是使用 Windows 还是 Linux/Unix 系统创建该文件的? (用什么应用程序?)
/编辑:这对我有用:
I had the same problem with my app. Try using Apache Commons IO's
FileUtils
.This adds another 100kb to your apk, but make File handling much easier.
And if you store the file as
myfile.txt
instead of.mp3
, does it give the same output?And did you create the file with a Windows or Linux/Unix System? (And with what application?)
/edit: This works for me: