Konvertieren Sie InputStream in BufferedReader

149

Ich versuche, eine Textdatei zeilenweise mit InputStream aus dem Assets-Verzeichnis in Android zu lesen.

Ich möchte den InputStream in einen BufferedReader konvertieren, um die readLine () verwenden zu können.

Ich habe folgenden Code:

InputStream is;
is = myContext.getAssets().open ("file.txt");
BufferedReader br = new BufferedReader (is);

In der dritten Zeile wird der folgende Fehler gelöscht:

Mehrere Markierungen in dieser Zeile
Der Konstruktor BufferedReader (InputStream) ist nicht definiert.

Was ich in C ++ versuche, wäre ungefähr so:

StreamReader file;
file = File.OpenText ("file.txt");

line = file.ReadLine();
line = file.ReadLine();
...

Was mache ich falsch oder wie soll ich das machen? Vielen Dank!

karse23
quelle

Antworten:

281

BufferedReaderkann nicht InputStreamdirekt einwickeln . Es hüllt einen anderen ein Reader. In diesem Fall möchten Sie Folgendes tun:

BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
ColinD
quelle
Ja, das Umschließen eines InputStreams mit einem InputStreamReader, der von einem BufferedReader umschlossen wird, ist ein häufiger "Trick", um die Funktion readLine () zu verwenden.
Setup
14
Ich empfehle: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));hinzugefügt in Java 7
brcolow
StandardCharsets funktionieren nicht auf API-Ebene> 19. @ Brcolow
Florida
1
Ich denke, Sie wollen damit sagen, dass es nicht funktioniert, wenn API Level> = 19?
Brcolow
23

Ein BufferedReader-Konstruktor verwendet einen Reader als Argument, keinen InputStream. Sie sollten zuerst einen Reader aus Ihrem Stream erstellen, wie folgt:

Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);

Vorzugsweise geben Sie dem StreamReader-Konstruktor auch einen Zeichensatz- oder Zeichenkodierungsnamen an. Da ein Stream nur Bytes bereitstellt, bedeutet die Konvertierung dieser in Text, dass die Codierung bekannt sein muss. Wenn Sie es nicht angeben, wird der Systemstandard angenommen.

G_H
quelle
20
InputStream is;
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
Hans
quelle