Преобразовать InputStream в BufferedReader


149

Я пытаюсь прочитать текстовый файл построчно, используя InputStream из каталога ресурсов в Android.

Я хочу преобразовать InputStream в BufferedReader, чтобы иметь возможность использовать readLine ().

У меня есть следующий код:

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

В третьей строке сбрасывается следующая ошибка:

Несколько маркеров на этой линии
Конструктор BufferedReader (InputStream) не определен.

То, что я пытаюсь сделать в C ++, будет примерно таким:

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

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

Что я делаю не так или как мне это делать? Спасибо!

Ответы:


281

BufferedReaderне могу обернуть InputStreamпрямо. Это оборачивает другой Reader. В этом случае вы хотели бы сделать что-то вроде:

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

Да, перенос InputStream с InputStreamReader, который оборачивается BufferedReader, является распространенным «приемом» использования функции readLine ().
Настройка

14
Рекомендую: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));добавлено в Java 7
brcolow

StandardCharsets не работают на уровне API> 19. @brcolow
Флорида

1
Я думаю, что вы хотите сказать, не работает, если API Level> = 19?
brcolow

23

Конструктор BufferedReader принимает считыватель в качестве аргумента, а не InputStream. Сначала вы должны создать Reader из вашего потока, вот так:

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

Предпочтительно вы также предоставляете имя кодировки или кодировки символов для конструктора StreamReader. Поскольку поток предоставляет только байты, преобразование их в текст означает, что кодировка должна быть известна. Если вы не укажете его, предполагается системное значение по умолчанию.


20
InputStream is;
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.