Làm cách nào để biến Chuỗi thành InputStreamReader trong java?


281

Làm thế nào tôi có thể chuyển đổi một Stringgiá trị thành một InputStreamReader?

Câu trả lời:


327

ByteArrayInputStream cũng thực hiện thủ thuật:

InputStream is = new ByteArrayInputStream( myString.getBytes( charset ) );

Sau đó chuyển đổi sang người đọc:

InputStreamReader reader = new InputStreamReader(is);

3
Bạn có thể muốn kế thừa bộ ký tự mặc định của nền tảng.
mỏng

2
Cảm ơn. Làm xong. Cách tốt nhất để phát hiện bộ ký tự mặc định của plataform là gì?
Guido

5
Hoặc chỉ sử dụng getBytes () mà không có tham số ... Có thể cho rằng nó không tồn tại, nhưng nó sẽ sử dụng mã hóa mặc định.
Michael Borgwardt

1
ByteArrayInputStream : Vì: JDK1.0 Không có lý do nhỏ nhất nào để cho rằng lớp này là loại kể từ Java 1.4. Số phiên bản sai đó đặc biệt kỳ lạ khi Java 1.4 được giới thiệu NIOvà việc giới thiệu một API và người kế thừa của nó trong cùng một phiên bản là vô nghĩa.
Holger

61

Tôi cũng tìm thấy lớp apache commons IOUtils, vì vậy:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));

35
Chuyển đổi String-> byte [] hoặc ngược lại mà không đề cập đến mã hóa ký tự hầu như luôn là một lỗi.
Joachim Sauer

1
Điều này có thể gây mất dữ liệu, tùy thuộc vào mã hóa nền tảng mặc định và các ký tự trong chuỗi. Chỉ định mã hóa Unicode cho cả hoạt động mã hóa và giải mã sẽ tốt hơn. Đọc phần này để biết thêm chi tiết: lawargumentexception.blogspot.com/2009/05/ Khăn
McDowell

Không phải là thông số mã hóa chỉ cần để có được byte trong một mã hóa nhất định? Tôi nghĩ miễn là bạn chọn cùng một mã hóa cho lệnh gọi String # getBytes khi bạn chọn cho hàm tạo InputSTreamReader, thì việc bạn chọn cái nào không thực sự quan trọng. Tôi khá chắc chắn rằng Joachim và McDowell đã sai đối với trường hợp cụ thể này. Không có kiến ​​thức mã hóa cần thiết để bọc InputStreamReader xung quanh Chuỗi.
Stijn de Witt

4
@Stijn de Witt - trả lời muộn màng tôi biết, nhưng tôi chỉ thấy điều này. Nếu mã hóa nền tảng mặc định không hỗ trợ các điểm mã trong chuỗi, mất dữ liệu sẽ xảy ra. Nếu mã hóa mặc định của bạn là UTF-8, không có vấn đề gì. Nếu bạn đang chạy trên Windows, bạn sẽ mất hầu hết bộ Unicode vì các JRE đó mặc định là mã hóa "ANSI" cũ. Bằng chứng là trong liên kết tôi đã đăng. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")sẽ mất mát
McDowell

hooray, sử dụng thư viện của bên thứ 3 để biến một lớp lót thành một lớp lót lớn hơn. Không nói về việc chuyển đổi vô dụng Stringthành một byte[]mảng để chuyển đổi các byte trở lại charsau đó là
Lọ

32

Nó có phải đặc biệt là InputStreamReader không? Làm thế nào về việc sử dụng StringReader ?

Mặt khác, bạn có thể sử dụng StringBufferInputStream , nhưng nó không được hỗ trợ vì các vấn đề chuyển đổi ký tự (đó là lý do tại sao bạn nên thích StringReader).


16

Câu hỏi tương tự như @Dan - tại sao không phải StringReader?

Nếu nó phải là InputStreamReader, thì:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);

Đẹp, nhưng dòng thứ 2 nên làbyte[] bytes = charset.getBytes();
AabinGunz

1
Tôi không nghĩ vậy Abhishek. Trong ví dụ của tôi, chuỗi là thể hiện của Chuỗi mà bạn muốn truy cập bằng InputStreamReader.
bộ công cụ

3

Bạn đang cố gắng để có được một) Readerchức năng trong số InputStreamReader, hoặc b) InputStreamchức năng ra khỏi InputStreamReader? Bạn sẽ không nhận được b). InputStreamReaderkhông phải là một InputStream.

Mục đích của InputStreamReaderviệc lấy một InputStream- một nguồn byte - và giải mã các byte thành ký tự ở dạng a Reader. Bạn đã có dữ liệu của mình dưới dạng ký tự (Chuỗi gốc). Mã hóa Chuỗi của bạn thành byte và giải mã byte trở lại ký tự sẽ là một hoạt động dự phòng.

Nếu bạn đang cố gắng lấy Readerra khỏi nguồn của mình, hãy sử dụng StringReader.

Nếu bạn đang cố gắng để có được một InputStream(chỉ cung cấp cho bạn byte), hãy sử dụng dấu phẩy apache IOUtils.toInputStream(..)như được đề xuất bởi các câu trả lời khác ở đây.


2

Bạn có thể thử Cactoos :

InputStream stream = new InputStreamOf(str);

Sau đó, nếu bạn cần một Reader:

Reader reader = new ReaderOf(stream);
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.