Converter InputStream em BufferedReader


149

Estou tentando ler um arquivo de texto linha por linha usando InputStream no diretório de ativos no Android.

Eu quero converter o InputStream em um BufferedReader para poder usar o readLine ().

Eu tenho o seguinte código:

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

A terceira linha descarta o seguinte erro:

Vários marcadores nesta linha
O construtor BufferedReader (InputStream) não está localizado.

O que estou tentando fazer em C ++ seria algo como:

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

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

O que estou fazendo de errado ou como devo fazer isso? Obrigado!

Respostas:


281

BufferedReadernão pode quebrar um InputStreamdiretamente. Envolve outro Reader. Nesse caso, você deseja fazer algo como:

BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

Sim, agrupar um InputStream com um InputStreamReader, envolvido por um BufferedReader, é um "truque" comum para usar a função readLine ().
Setup

14
Eu recomendo: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));adicionado em Java 7
brcolow

StandardCharsets não funcionam no nível da API> 19. @brcolow
Florida

1
Eu acho que você quer dizer que não funciona, a menos que o nível da API seja = 19?
brcolow

23

Um construtor BufferedReader usa um leitor como argumento, não um InputStream. Você deve primeiro criar um Reader a partir do seu fluxo, da seguinte forma:

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

De preferência, você também fornece um nome de codificação de caractere ou de caractere ao construtor StreamReader. Como um fluxo fornece apenas bytes, convertê-los em texto significa que a codificação deve ser conhecida. Se você não o especificar, o padrão do sistema será assumido.


20
InputStream is;
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.