2013-02-26 19 views
5

Tôi thấy rằng bạn có thể chỉ định UTF-16 làm bộ ký tự qua Charset.forName("UTF-16") và bạn có thể tạo bộ giải mã UTF-16 mới qua Charset.forName("UTF-16").newDecoder(), nhưng tôi chỉ thấy khả năng chỉ định CharsetDecoder trên hàm tạo của InputStreamReader.Làm thế nào để ép buộc UTF-16 trong khi đọc/ghi trong Java?

Làm cách nào để bạn chỉ định sử dụng UTF-16 khi đọc bất kỳ luồng nào trong Java?

+1

Nếu lớp này cho phép, bạn có thể làm như vậy tại ranh giới giữa luồng byte và luồng ký tự. (InputStreamReader là một lớp như vậy, đối với các Reader khác không cung cấp cho bạn tùy chọn chỉ định bộ ký tự, chỉ cần quấn nó quanh InputStreamReader). Cấu trúc thấp hơn ở mức InputStream (luồng byte) không có khái niệm về bộ ký tự. – nhahtdh

Trả lời

11

Luồng đầu vào xử lý các byte thô. Khi bạn đọc trực tiếp từ luồng đầu vào, tất cả những gì bạn nhận được là byte thô nơi bộ ký tự không liên quan.

Việc giải thích byte thô thành ký tự, theo định nghĩa, yêu cầu một số loại bản dịch: làm cách nào để dịch từ byte thô thành chuỗi có thể đọc được? "Bản dịch" đó xuất hiện dưới dạng một bộ ký tự.

Lớp "đã thêm" này được thực hiện bởi Người đọc. Do đó, để đọc các ký tự (thay vì byte) từ một luồng, bạn cần phải xây dựng một số Reader của một số loại (tùy thuộc vào nhu cầu của bạn) trên đầu luồng. Ví dụ:

InputStream is = ...; 
Reader reader = new InputStreamReader(is, Charset.forName("UTF-16")); 

Điều này sẽ gây ra reader.read() để đọc các ký tự sử dụng bộ ký tự bạn chỉ định. Nếu bạn muốn đọc toàn bộ dòng, hãy sử dụng BufferedReader ở trên cùng:

BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-16"))); 
String line = reader.readLine(); 
Các vấn đề liên quan