Android - 从资产中读取文本文件似乎在实际数据之前/之后包含大量垃圾?

发布于 2024-12-17 11:18:52 字数 1469 浏览 2 评论 0原文

我将一个文本文件与我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

丢了幸福的猪 2024-12-24 11:18:52

这是因为 AssetFileDescriptor.getFileDescriptor() 适用于您的 .apk,而不是 .apk 内的 mytextfile.mp3 文件。要使用 AssetFileDescriptor,您还需要考虑 AssetFileDescriptor.getStartOffset(),它是实际文件的偏移量,即 mytextfile.mp3 在你的情况下。

但有一个简单的方法可以解决您的问题。请改用 AssetManager.open(String),这将为您提供 mytextfile.mp3 文件的 InputStream。像这样:

InputStream inputStream = getAssets().open("mytextfile.mp3");
BufferedReader f = new BufferedReader(new InputStreamReader(inputStream));
// ...

This is because AssetFileDescriptor.getFileDescriptor() is for your .apk and not the mytextfile.mp3 file inside the .apk. To work with AssetFileDescriptor 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 an InputStream to the mytextfile.mp3 file. Like this:

InputStream inputStream = getAssets().open("mytextfile.mp3");
BufferedReader f = new BufferedReader(new InputStreamReader(inputStream));
// ...
单调的奢华 2024-12-24 11:18:52

Eclipse/ADT 有时会导致资源损坏。尝试清理并重建项目,看看是否可以解决问题。

Eclipse/ADT occasionally gets the resources corrupted. Try doing a project clean and rebuild to see if that fixes it.

毁虫ゝ 2024-12-24 11:18:52

我的应用程序也遇到了同样的问题。尝试使用 Apache Commons IO FileUtils
这会为您的 apk 增加 100kb,但会使文件处理变得更加容易。
如果将文件存储为 myfile.txt 而不是 .mp3,它会给出相同的输出吗?

您是使用 Windows 还是 Linux/Unix 系统创建该文件的? (用什么应用程序?)

/编辑:这对我有用:

AssetManager am = this.getAssets();
        InputStream is = am.open("mytextfile.mp3");
        InputStreamReader inputStreamReader = new InputStreamReader(is);
        BufferedReader f = new BufferedReader(inputStreamReader);
        String line = f.readLine();
        while (line != null) {
            // do stuff
            Log.d("TAG", line);
            line = f.readLine();
        }

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:

AssetManager am = this.getAssets();
        InputStream is = am.open("mytextfile.mp3");
        InputStreamReader inputStreamReader = new InputStreamReader(is);
        BufferedReader f = new BufferedReader(inputStreamReader);
        String line = f.readLine();
        while (line != null) {
            // do stuff
            Log.d("TAG", line);
            line = f.readLine();
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文