Bagaimana cara mengubah sebuah String menjadi InputStreamReader di java?

281

Bagaimana saya bisa mengubah Stringnilai menjadi InputStreamReader?

Yossale
sumber

Jawaban:

327

ByteArrayInputStream juga melakukan trik:

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

Kemudian konversi ke pembaca:

InputStreamReader reader = new InputStreamReader(is);
Guido
sumber
3
Anda mungkin ingin mewarisi charset default platform.
langsing
2
Terima kasih. Selesai Apa cara terbaik untuk mendeteksi charset default plataform?
Guido
5
Atau cukup gunakan getBytes () tanpa parameter ... Mungkin tidak seharusnya ada, tetapi akan menggunakan pengodean default.
Michael Borgwardt
1
ByteArrayInputStream : Sejak: JDK1.0 Tidak ada alasan sedikit pun untuk menganggap bahwa kelas ini adalah "sejak Java 1.4". Nomor versi yang salah itu sangat aneh karena Java 1.4 diperkenalkan NIOdan tidak masuk akal untuk memperkenalkan API dan penerus konsepnya dalam versi yang sama.
Holger
61

Saya juga menemukan kelas apache commons IOUtils, jadi:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Yossale
sumber
35
Mengubah String-> byte [] atau sebaliknya tanpa menyebutkan pengkodean karakter hampir selalu berupa bug.
Joachim Sauer
1
Ini dapat menyebabkan kehilangan data, tergantung pada pengkodean platform default dan karakter dalam string. Menentukan enkode Unicode untuk operasi enkode dan dekode akan lebih baik. Baca ini untuk detail lebih lanjut: illegalargumentexception.blogspot.com/2009/05/...
McDowell
Bukankah param pengkodean hanya perlu untuk mendapatkan byte dalam pengkodean tertentu? Saya pikir selama Anda memilih pengkodean yang sama untuk panggilan String # getBytes saat Anda memilih untuk konstruktor InputSTreamReader, tidak masalah yang mana yang Anda pilih. Saya cukup yakin bahwa Joachim dan McDowell salah untuk kasus spesifik ini. Tidak diperlukan pengetahuan pengodean untuk membungkus InputStreamReader di sekitar sebuah String.
Stijn de Witt
4
@Stijn de Witt - balasan terlambat saya tahu, tapi saya baru saja melihat ini. Jika pengkodean platform default tidak mendukung poin kode dalam string, kehilangan data akan terjadi. Jika penyandian standar Anda adalah UTF-8, tidak ada masalah. Jika Anda menjalankan pada Windows, Anda akan kehilangan sebagian besar dari set Unicode karena JREs tersebut default untuk penyandian "ANSI" lama. Buktinya ada di tautan yang saya posting. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")akan rugi.
McDowell
hore, menggunakan perpustakaan pihak ke-3 untuk mengubah satu-liner menjadi ... satu-liner yang lebih besar. Tidak untuk berbicara tentang konversi berguna dari Stringmenjadi byte[]array untuk mengkonversi byte kembali ke chars kemudian ...
Holger
32

Apakah harus secara khusus InputStreamReader? Bagaimana kalau menggunakan StringReader ?

Kalau tidak, Anda bisa menggunakan StringBufferInputStream , tetapi sudah usang karena masalah konversi karakter (itulah sebabnya Anda harus lebih suka StringReader).

Dan Dyer
sumber
16

Pertanyaan yang sama dengan @Dan - mengapa tidak StringReader?

Jika itu harus InputStreamReader, maka:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
toolkit
sumber
Bagus, tetapi baris ke-2 seharusnyabyte[] bytes = charset.getBytes();
AabinGunz
1
Saya tidak berpikir begitu Abhishek. Dalam contoh saya, string adalah turunan dari String yang ingin Anda akses menggunakan InputStreamReader.
toolkit
3

Apakah Anda mencoba untuk mendapatkan) Readerfungsionalitas keluar InputStreamReader, atau b) InputStreamfungsionalitas keluar InputStreamReader? Anda tidak akan mendapatkan b). InputStreamReaderbukan InputStream.

Tujuannya InputStreamReaderadalah untuk mengambil InputStream- sumber byte - dan mendekode byte ke karakter dalam bentuk a Reader. Anda sudah memiliki data Anda sebagai karakter (String asli Anda). Pengkodean String Anda ke dalam byte dan decoding byte kembali ke karakter akan menjadi operasi yang berlebihan.

Jika Anda mencoba untuk Readerkeluar dari sumber Anda, gunakan StringReader.

Jika Anda mencoba untuk mendapatkan InputStream(yang hanya memberi Anda byte), gunakan apache commons IOUtils.toInputStream(..)seperti yang disarankan oleh jawaban lain di sini.

Fai Ng
sumber
2

Anda dapat mencoba Cactoos :

InputStream stream = new InputStreamOf(str);

Kemudian, jika Anda membutuhkan Reader:

Reader reader = new ReaderOf(stream);
yegor256
sumber