将InputStream转换为BufferedReader


149

我正在尝试使用InputStream从Android的Assets目录中逐行读取文本文件。

我想将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();
...

我在做什么错或应该怎么做?谢谢!

Answers:


281

BufferedReader不能InputStream直接包装。它包装另一个Reader。在这种情况下,您需要执行以下操作:

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

是的,使用InputStreamReader来包装InputStream并使用BufferedReader对其进行包装是使用readLine()函数的常见“技巧”。
设置

14
我建议:BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));在Java 7中添加
brcolow

StandardCharsets在大于19的API级别上不起作用。@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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.