แปลง InputStream เป็น BufferedReader


149

ฉันกำลังพยายามอ่านไฟล์ข้อความทีละบรรทัดโดยใช้ InputStream จากไดเรกทอรีสินทรัพย์ใน Android

ฉันต้องการแปลง InputStream เป็น BufferedReader เพื่อให้สามารถใช้ readLine ()

ฉันมีรหัสต่อไปนี้:

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

บรรทัดที่สามลดข้อผิดพลาดต่อไปนี้:

เครื่องหมายหลายอันในบรรทัดนี้
Constructor 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 เนื่องจากสตรีมมีขนาดเพียงไบต์การแปลงเป็นข้อความหมายความว่าต้องรู้จักการเข้ารหัส หากคุณไม่ได้ระบุไว้ระบบจะถือว่าเป็นค่าเริ่มต้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.