InputStreamをBufferedReaderに変換


149

AndroidのアセットディレクトリからInputStreamを使用して、テキストファイルを1行ずつ読み込もうとしています。

InputStreamをBufferedReaderに変換して、readLine()を使用できるようにします。

私は次のコードを持っています:

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

3行目は次のエラーをドロップします。

このラインに複数のマーカー
コンストラクタBufferedReader(InputStream)は未定義です。

私がC ++でやろうとしているのは次のようなものです:

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

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

私は何を間違っているのですか、それをどのように行うべきですか?ありがとう!

回答:


281

BufferedReaderInputStream直接ラップすることはできません。別を包みReaderます。この場合、次のようなことを行います。

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

はい、BufferedReaderでラップされたInputStreamReaderでInputStreamをラップすることは、readLine()関数を使用するための一般的な「トリック」です。
設定

14
推奨:BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));Java 7で追加
brcolow、2015年

StandardCharsetはAPIレベル> 19では機能しません。@brcolow
フロリダ州

1
APIレベル> = 19でなければ機能しないと言うつもりですか?
brcolow

23

BufferedReaderコンストラクターは、InputStreamではなくリーダーを引数として受け取ります。最初に、次のようにストリームからリーダーを作成する必要があります。

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

StreamReaderコンストラクターには、Charsetまたは文字エンコード名も指定することが望ましい。ストリームはバイトを提供するだけなので、これらをテキストに変換することは、エンコーディングがわかっている必要があることを意味します。指定しない場合は、システムのデフォルトが使用されます。


20
InputStream is;
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.