2011-03-04 104 views
124

我试图从Android的资产目录中使用InputStream逐行读取文本文件。将InputStream转换为BufferedReader

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

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

回答

226

BufferedReader无法直接包装InputStream。它包裹另一个Reader。在这种情况下,你想要做的事,如:

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

是的,使用由BufferedReader包装的InputStreamReader包装InputStream是使用readLine()函数的常见“技巧”。 – Anton 2014-09-29 11:09:47

+11

我推荐: 'BufferedReader br = new BufferedReader(new InputStreamReader(is,StandardCharsets.UTF_8));' 在Java 7中添加 – brcolow 2015-03-19 21:51:47

+0

StandardCharsets不适用于API级别> 19。 @brcolow – Florida 2015-08-15 21:21:46

17
InputStream is; 
InputStreamReader r = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(r); 
19

一个BufferedReader构造方法带有reader作为参数,而不是一个InputStream。你应该首先从信息流中创建一个阅读器,像这样:

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

Preferrably,你也给StreamReader的构造函数提供一个字符集或字符编码名称。由于流只提供字节,因此将它们转换为文本意味着编码必须是已知的。如果您没有指定它,则假定系统默认。

相关问题