Chuyển đổi InputStream thành BufferedReader


149

Tôi đang cố đọc từng dòng tệp văn bản bằng InputStream từ thư mục tài sản trong Android.

Tôi muốn chuyển đổi InputStream thành BufferedReader để có thể sử dụng readLine ().

Tôi có đoạn mã sau:

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

Dòng thứ ba giảm lỗi sau:

Nhiều điểm đánh dấu ở dòng này
Hàm tạo BufferedReader (InputStream) không bị hủy bỏ.

Những gì tôi đang cố gắng làm trong C ++ sẽ giống như:

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

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

Tôi đang làm gì sai hay tôi nên làm thế nào? Cảm ơn!

Câu trả lời:


281

BufferedReaderkhông thể bọc InputStreamtrực tiếp. Nó kết thúc tốt đẹp khác Reader. Trong trường hợp này, bạn muốn làm một cái gì đó như:

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

Có, gói một InputStream bằng InputStreamReader, được bao bọc bởi BufferedReader là một "mẹo" phổ biến để sử dụng hàm readLine ().
Thiết lập

14
Tôi khuyên bạn nên: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));đã thêm vào Java 7
brcolow 19/03/2015

StandardCharsets không hoạt động ở cấp API> 19. @brcolow
Florida

1
Tôi nghĩ bạn muốn nói là không hoạt động trừ khi Cấp API> = 19?
brcolow

23

Hàm tạo BufferedReader lấy một trình đọc làm đối số, không phải là InputStream. Trước tiên, bạn nên tạo Trình đọc từ luồng của mình, như vậy:

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

Tốt hơn là, bạn cũng cung cấp một tên mã hóa ký tự hoặc ký tự cho hàm tạo StreamReader. Vì một luồng chỉ cung cấp byte, chuyển đổi chúng thành văn bản có nghĩa là mã hóa phải được biết. Nếu bạn không chỉ định nó, mặc định hệ thống được giả định.


20
InputStream is;
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.