Преобразование InputStream в BufferedReader

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

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

У меня такой код:

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

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

Multiple markers at this line
The constructor BufferedReader (InputStream) is undefinded.

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

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

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

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


person karse23    schedule 04.03.2011    source источник


Ответы (2)


BufferedReader не может напрямую обернуть InputStream. Заворачивает еще Reader. В этом случае вам нужно сделать что-то вроде:

BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
person ColinD    schedule 04.03.2011
comment
Да, обертывание InputStream с помощью InputStreamReader, которое обернуто с помощью BufferedReader, является распространенным трюком при использовании функции readLine (). - person Setup; 29.09.2014
comment
Рекомендую: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); добавлено в Java 7 - person brcolow; 20.03.2015
comment
StandardCharsets не работают на уровне API ›19. @brcolow - person Florida; 16.08.2015
comment
Я думаю, вы хотите сказать, что не работает, если уровень API ›= 19? - person brcolow; 16.08.2015

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

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

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

person G_H    schedule 04.03.2011