Android - Lesen einer Textdatei aus Assets scheint eine Menge Junk vor / nach den tatsächlichen Daten zu enthalten?

  • Ich packe eine Textdatei mit meiner Android-App (in Assets), die ich in der App selbst gelesen habe.

    Um zu vermeiden, dass diese Datei komprimiert wird, Es heißt "mytestfile.mp3" und bis vor kurzem hat das gut funktioniert.

    Bei einer der letzten Änderungen von SDK / ADT scheint beim Lesen etwas "Seltsames" zu passieren Assets und ich bin offen für Ideen, was es ist ...

    Ich benutze Code wie diesen

     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);
    }
     

    Was ich jetzt aus dem Protokoll sehe, ist ziemlich seltsam - wenn die Datei etwas Ähnliches enthielt

     Fred
    Barney
    Wilma
     

    Ich sehe im Protokoll so viel Unfug wie diesen:

     ��ߴ�!�c�W���6�f����m�>ߩ��? ?? ' 6  # 6   l0  mp  
      

    gefolgt von eventuell meinem Textinhalt

     Fred
    Barney
    Wilma
     

    gefolgt von einer weiteren Tonne Kauderwelsch - von denen einige so aussehen

                 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                            ETMETA-INF/CERT.SFPK        |v?W7@ ]                        "META-INF / CERT.RSAPK"?
                                    
    30 November 2011
3 answers
  • Dies liegt daran, dass AssetFileDescriptor.getFileDescriptor() für Ihre .apk-Datei und nicht für die mytextfile.mp3 -Datei in der .apk-Datei ist. Um mit AssetFileDescriptor arbeiten zu können, müssen Sie z. AssetFileDescriptor.getStartOffset() wird ebenfalls berücksichtigt. Dies ist der Versatz zur tatsächlichen Datei, d. H. mytextfile.mp3 in Ihrem Fall.

    Es gibt jedoch eine einfache Lösung für Ihr Problem. Verwenden Sie stattdessen AssetManager.open(String). Dadurch erhalten Sie eine InputStream für die Datei mytextfile.mp3. So:

     InputStream inputStream = getAssets().open("mytextfile.mp3");
    BufferedReader f = new BufferedReader(new InputStreamReader(inputStream));
    // ...
     
    02 December 2011
    Martin Nordholts
  • Bei Eclipse / ADT werden die Ressourcen gelegentlich beschädigt. Versuchen Sie, ein Projekt zu reinigen und neu zu erstellen, um zu sehen, ob es das Problem behebt

    22 November 2011
    kabukoBrad Leach
  • Ich hatte das gleiche Problem mit meiner App. Versuchen Sie es mit Apache Commons IOs FileUtils. Dies fügt Ihrer apk weitere 100kb hinzu, erleichtert jedoch die Dateibehandlung. Wenn Sie die Datei als myfile.txt anstelle von .mp3 speichern, erhalten Sie dann dieselbe Ausgabe?

    Und haben Sie die Datei mit einem Windows- oder Linux / Unix-System erstellt? (Und mit welcher Anwendung?)

    / edit: Das funktioniert für mich:

     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();
            }
     
    30 November 2011
    Force