Wie lese ich eine Textdatei aus dem Verzeichnis "assets" als String?

8

Ich habe eine Datei in meinem Assets-Ordner ... wie lese ich sie?

Jetzt versuche ich:

%Vor%

Aber es hat eine Nullzeiger-Ausnahme ausgelöst ...

Die Datei heißt "Ursprung" und befindet sich in den Ordner-Assets

Ich habe versucht, es zu übertragen:

%Vor%

und

%Vor%

aber beides gescheitert ... einen Ratschlag?

    
Mascarpone 01.02.2011, 18:56
quelle

5 Antworten

6

Sie können einen Eingabestream mit AssetsManager öffnen.

%Vor%

getAssets() ist eine Methode der Klasse Context .

Beachten Sie auch, dass Sie keinen Zeichenpuffer ( buf = new char[1024] , die letzte Zeile Ihres Zyklus) neu erstellen sollten.

    
Roman Mazur 01.02.2011, 19:11
quelle
11

Die readLine () -Methode von BufferedReader gibt eine Null zurück, wenn das Ende der Datei erreicht ist. Daher müssen Sie darauf achten und versuchen, sie an Ihre Zeichenfolge anzuhängen.

Der folgende Code sollte einfach genug sein:

%Vor%

Einfach und auf den Punkt.

    
Raceimaztion 01.02.2011 19:43
quelle
6

Kurze Antwort, tu dies:

%Vor%

Es ist sehr einfach, sehr schnell und funktioniert gut für unangemessen große Textdateien (100+ MB)

Lange Antwort:

(Code am Ende)

Oft ist es egal, aber diese Methode ist ziemlich schnell und gut lesbar. Tatsächlich ist es eine Ordnung der Komplexität, die schneller ist als die Antwort von @ Racemation - O (n) statt O (n ^ 2).

Ich habe sechs Methoden getestet (von langsam bis schnell):

  • concat: Zeile für Zeile lesen, concat mit str + = ... * Das ist erschreckend langsam auch für kleinere Dateien (dauert ~ 70 Sekunden für eine 3MB Datei) *
  • strbuider ratenlänge: StringBuilder, initialisiert mit der Dateigröße. Ich vermute, dass es langsam ist, weil es wirklich versucht, einen so großen Teil des linearen Gedächtnisses zu finden.
  • strbuilder mit Zeilenpuffer: StringBuilder, Datei wird Zeile für Zeile gelesen
  • strbuffer mit char [] buffer: Concat mit StringBuffer, lese die Datei in 16k Blöcken
  • strbuilder mit char [] buffer: Concat mit StringBuilder, lese die Datei in 16k Blöcken
  • pre-allocate byte [filesize] buffer: Vergeben Sie ein byte [] puffern Sie die Größe der Datei und lassen Sie die java api entscheiden, wie einzelne Blöcke gepuffert werden sollen.

Fazit:

Die Vorabzuweisung des Puffers ist bei sehr großen Dateien am schnellsten, aber die Methode ist nicht sehr vielseitig, da die gesamte Dateigröße im Voraus bekannt sein muss. Deshalb schlage ich vor, strBuilder mit char [] Puffern zu verwenden, es ist immer noch einfach und bei Bedarf leicht änderbar, um jeden Eingabestrom anstelle von nur Dateien zu akzeptieren. Aber es ist sicherlich schnell genug für alle vernünftigen Fälle.

Testergebnisse + Code

%Vor%

Ps. Sie haben vielleicht bemerkt, dass StringBuffer etwas schneller als StringBuilder ist. Das ist ein bisschen Unsinn, weil die Klassen gleich sind, außer dass StringBuilder nicht synchronisiert ist. Wenn irgendjemand das nicht reproduzieren kann (...) bin ich sehr neugierig :)

    
kritzikratzi 20.07.2013 00:02
quelle
1

Ich habe eine Funktion geschrieben, die dasselbe tut wie deine. Ich habe es vor einer Weile geschrieben, aber ich glaube, es funktioniert immer noch richtig.

%Vor%

Jetzt können Sie diese Funktion verwenden, wenn Sie möchten, aber wenn Sie die Datei entweder durch ein Dateiobjekt oder eine Zeichenfolge übergeben, vergewissern Sie sich, dass Sie entweder den vollständigen Pfad der Datei angeben, z. B. "C: \ Programme" \ test.dat "ODER Sie geben den relativen Link von Ihrem Arbeitsverzeichnis ein. Ihr Arbeitsverzeichnis ist normalerweise das Verzeichnis, von dem aus Sie die Anwendung starten (außer Sie ändern es). Wenn sich die Datei also in einem Ordner namens data befindet, geben Sie "./data/test.dat"

ein

Ja, ich weiß, dass dies mit Android funktioniert, so dass der Windows-URI nicht anwendbar ist, aber Sie sollten meinen Standpunkt verstehen.

    
jluzwick 01.02.2011 19:12
quelle
1

Sie sollten org.appache.commons.io.IOUtils.toString(InputStream is) versuchen, um den Dateiinhalt als String zu erhalten. Dort können Sie InputStream object übergeben, das Sie von

erhalten %Vor%

in Ihrem Activity .

Um String zu erhalten, verwenden Sie Folgendes:

%Vor%     
Sanket Patel 03.09.2013 11:01
quelle