Convertir InputStream en BufferedReader

149

J'essaie de lire un fichier texte ligne par ligne en utilisant InputStream à partir du répertoire des actifs d'Android.

Je veux convertir InputStream en BufferedReader pour pouvoir utiliser readLine ().

J'ai le code suivant:

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

La troisième ligne supprime l'erreur suivante:

Plusieurs marqueurs sur cette ligne
Le constructeur BufferedReader (InputStream) n'est pas trouvé.

Ce que j'essaie de faire en C ++ serait quelque chose comme:

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

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

Qu'est-ce que je fais mal ou comment dois-je le faire? Merci!

karse23
la source

Réponses:

281

BufferedReaderne peut pas envelopper un InputStreamdirectement. Il en enveloppe un autre Reader. Dans ce cas, vous voudriez faire quelque chose comme:

BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
ColinD
la source
Oui, encapsuler un InputStream avec un InputStreamReader, qui est encapsulé par un BufferedReader est une «astuce» courante pour utiliser la fonction readLine ().
Configuration du
14
Je recommande: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));ajouté dans Java 7
brcolow
Les StandardCharsets ne fonctionnent pas au niveau d'API> 19. @brcolow
Florida
1
Je pense que vous voulez dire que cela ne fonctionne pas à moins que le niveau d'API> = 19?
brcolow
23

Un constructeur BufferedReader prend un lecteur comme argument, pas un InputStream. Vous devez d'abord créer un lecteur à partir de votre flux, comme ceci:

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

De préférence, vous fournissez également un nom de jeu de caractères ou de codage de caractères au constructeur StreamReader. Puisqu'un flux ne fournit que des octets, les convertir en texte signifie que l'encodage doit être connu. Si vous ne le spécifiez pas, la valeur par défaut du système est utilisée.

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