InputStream'i BufferedReader'a Dönüştür


149

Android varlık varlıkları dizininden InputStream kullanarak satır satır bir metin dosyası okumaya çalışıyorum.

Ben ReadLine () kullanabilmek için InputStream BufferedReader dönüştürmek istiyorum.

Takip koduna sahibim:

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

Üçüncü satır aşağıdaki hatayı bırakır:

Bu satırda birden çok işaretçi
BufferedReader yapıcısı (InputStream) tanımsız.

Ne C ++ yapmaya çalışıyorum gibi bir şey olurdu:

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

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

Neyi yanlış yapıyorum ya da nasıl yapmalıyım? Teşekkürler!

Yanıtlar:


281

BufferedReaderInputStreamdoğrudan satamıyor . Bir başkasını sarar Reader. Bu durumda şöyle bir şey yapmak istersiniz:

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

Evet, bir InputStream öğesini bir BufferedReader tarafından sarılmış bir InputStreamReader ile sarmak, readLine () işlevini kullanmak için yaygın bir "hile" dir.
Kurulum

14
Tavsiye ederim: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));Java 7'de eklendi
brcolow

StandardCharsets, API Düzeyi> 19'da çalışmaz. @brcolow
Florida

1
API Düzeyi> = 19 olmadığı sürece çalışmadığını söylemek istediğinizi düşünüyorum?
brcolow

23

Bir BufferedReader yapıcısı, bir okuyucuyu InputStream değil bağımsız değişken olarak alır . Önce akışınızdan bir Reader oluşturmanız gerekir, şöyle:

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

Tercihen, StreamReader yapıcısına bir Karakter Kümesi veya karakter kodlama adı da sağlarsınız. Bir akış yalnızca bayt sağladığı için bunları metne dönüştürmek kodlamanın bilinmesi gerektiği anlamına gelir. Bunu belirtmezseniz, sistem varsayılanı kabul edilir.


20
InputStream is;
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.