Hier ist, was ich in einer Aktivität zum gepufferten Lesen mache, erweitern / modifizieren, um es Ihren Bedürfnissen anzupassen
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt")));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
EDIT: Meine Antwort ist vielleicht nutzlos, wenn Ihre Frage lautet, wie es außerhalb einer Aktivität gemacht werden soll. Wenn Ihre Frage einfach ist, wie man eine Datei aus einem Asset liest, ist die Antwort oben.
AKTUALISIEREN :
Um eine Datei mit dem Typ zu öffnen, fügen Sie den Typ einfach wie folgt in den InputStreamReader-Aufruf ein.
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt"), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
BEARBEITEN
Wie @Stan im Kommentar sagt, summiert der Code, den ich gebe, keine Zeilen. mLine
wird bei jedem Durchgang ersetzt. Deshalb habe ich geschrieben//process line
. Ich gehe davon aus, dass die Datei irgendeine Art von Daten enthält (dh eine Kontaktliste) und jede Zeile separat verarbeitet werden sollte.
Wenn Sie die Datei einfach ohne jegliche Verarbeitung laden möchten, müssen Sie sie mLine
bei jedem Durchgang mit jedem Durchgang zusammenfassen StringBuilder()
und anhängen.
Noch eine Bearbeitung
Nach dem Kommentar von @Vincent habe ich das hinzugefügt finally
Block .
Beachten Sie auch, dass Sie in Java 7 und höher try-with-resources
die Funktionen AutoCloseable
und Closeable
Funktionen des aktuellen Java verwenden können.
KONTEXT
In einem Kommentar weist @LunarWatcher darauf hin, dass getAssets()
es sich um ein class
In handelt context
. Wenn Sie es also außerhalb von a aufrufen, activity
müssen Sie darauf verweisen und die Kontextinstanz an die Aktivität übergeben.
ContextInstance.getAssets();
Dies wird in der Antwort von @Maneesh erklärt. Wenn dies für Sie nützlich ist, stimmen Sie seiner Antwort zu, denn das ist er, der darauf hingewiesen hat.
finally {reader.close();}
.context.getAssets(.....)
funktioniert nur in Aktivität in einer anderen Klasse, die Sie dafür verwenden müssen
Context
.Mach ein Konstruktor für die Utils- Klasse als Referenz für die Aktivität (hässlicher Weg) oder den Kontext der Anwendung als Parameter. Verwenden Sie dazu getAsset () in Ihrer Utils-Klasse.
quelle
Context
.Besser spät als nie.
Unter bestimmten Umständen hatte ich Schwierigkeiten, Dateien Zeile für Zeile zu lesen. Die folgende Methode ist die beste, die ich bisher gefunden habe, und ich empfehle sie.
Verwendung:
String yourData = LoadData("YourDataFile.txt");
Wo angenommen wird, dass sich YourDataFile.txt in Assets befindet /
quelle
stream.available()
.quelle
input = new BufferedReader(new InputStreamReader(fIn));
.quelle
Einzeilige Lösung für Kotlin:
quelle
getAssets()
Die Methode funktioniert, wenn Sie innerhalb der Activity-Klasse aufrufen.Wenn Sie diese Methode in einer Nicht-Aktivitätsklasse aufrufen, müssen Sie diese Methode aus dem Kontext aufrufen, der von der Aktivitätsklasse übergeben wird. Unten sehen Sie die Zeile, in der Sie auf die Methode zugreifen können.
ContextInstance
kann als dies der Aktivitätsklasse übergeben werden.quelle
Das Lesen und Schreiben von Dateien war schon immer ausführlich und fehleranfällig. Vermeiden Sie diese Antworten und verwenden Sie stattdessen einfach Okio :
quelle
IOException
Try / Catch-Block 2) Schließen von Streams, falls eine Ausnahme ausgelöst wird 3) Dieser Code liest eine einzelne Zeile, nicht die gesamte Datei. In Bezug auf die Leistung ist diese Bibliothek definitiv einzigartig, daran besteht kein Zweifel. Sagen Sie mir jetzt, sollte ich "diese Antworten" trotzdem vermeiden und Okio nur zum Lesen von Dateien implementieren? Die Antwort lautet NEIN, es sei denn, es ist bereits Teil Ihrer App.Hier ist eine Methode zum Lesen einer Datei in Assets:
quelle
Sie können den Inhalt aus der Datei laden. Angenommen, die Datei befindet sich im Asset-Ordner.
Jetzt können Sie den Inhalt abrufen, indem Sie die Funktion wie folgt aufrufen
Berücksichtigen Sie, dass die Datei data.json unter Application \ app \ src \ main \ assets \ data.json gespeichert ist
quelle
In MainActivity.java
Sie können auch eine separate Klasse erstellen, die die gesamte Arbeit erledigt
Meiner Meinung nach ist es besser, eine Schnittstelle zu erstellen, aber es ist nicht notwendig
quelle
Wenn Sie eine andere Klasse als Aktivität verwenden, möchten Sie möglicherweise Folgendes tun:
quelle
Mit Kotlin können Sie Folgendes tun, um eine Datei aus Assets in Android zu lesen:
quelle
Es ist vielleicht zu spät, aber für andere, die nach pfirsichfarbenen Antworten suchen:
quelle
cityfile.txt
quelle
File no longer available That file has now been permanently removed and cannot be recovered
Die Scannerklasse kann dies vereinfachen.
quelle
@ HPTerm Antwort Kotlin Version:
quelle
var mLine:String
sollte seinvar mLine:String?
var data: String?
sollte seinvar data = ""
Rückgabetyp sollte seinString
Hier ist ein Weg , eine bekommen
InputStream
für eine Datei imassets
Ordner ohneContext
,Activity
,Fragment
oderApplication
. Wie Sie die Daten daraus erhaltenInputStream
liegt bei Ihnen. Es gibt viele Vorschläge dafür in anderen Antworten hier.Kotlin
Java
Alle Wetten sind ungültig, wenn ein Brauch
ClassLoader
im Spiel ist.quelle