Android - чтение текстового файла из активов, кажется, включает много мусора до / после фактических данных? - PullRequest
2 голосов
/ 22 ноября 2011

Я упаковываю текстовый файл с моим 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-центре), и поэтому я начну вознаграждение за идеи ...

Ответы [ 3 ]

9 голосов
/ 30 ноября 2011

Это потому, что AssetFileDescriptor.getFileDescriptor() для вашего .apk, а не для mytextfile.mp3 файла внутри .apk. Для работы с AssetFileDescriptor необходимо взять, например, AssetFileDescriptor.getStartOffset() также учитывается, что является смещением к фактическому файлу, т.е. mytextfile.mp3 в вашем случае.

Но есть простое решение вашей проблемы. Вместо этого используйте AssetManager.open(String), что даст вам InputStream для файла mytextfile.mp3. Как это:

InputStream inputStream = getAssets().open("mytextfile.mp3");
BufferedReader f = new BufferedReader(new InputStreamReader(inputStream));
// ...
0 голосов
/ 30 ноября 2011

У меня была такая же проблема с моим приложением. Попробуйте использовать Apache Commons IO's FileUtils. Это добавляет еще 100 КБ к вашему apk, но делает обработку файлов намного проще. И если вы сохраняете файл как myfile.txt вместо .mp3, выдает ли он тот же вывод?

А вы создали файл с системой Windows или Linux / Unix? (А с каким приложением?)

/ edit: это работает для меня:

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();
        }
0 голосов
/ 22 ноября 2011

Eclipse / ADT иногда приводит к повреждению ресурсов. Попробуйте очистить и перестроить проект, чтобы увидеть, исправит ли это.

...