Перетворити 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> = 19?
brcolow

23

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

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

Переважно, ви також надаєте ім'я кодування Charset або символів конструктору 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.