Saya memiliki String
yang ingin saya gunakan sebagai file InputStream
. Di Java 1.0, Anda dapat menggunakan java.io.StringBufferInputStream
, tetapi itu sudah @Deprecrated
(dengan alasan yang bagus - Anda tidak dapat menentukan penyandian kumpulan karakter):
Kelas ini tidak mengubah karakter menjadi byte dengan benar. Mulai JDK 1.1, cara yang disukai untuk membuat aliran dari string adalah melalui
StringReader
kelas.
Anda dapat membuat java.io.Reader
dengan java.io.StringReader
, tetapi tidak ada adaptor untuk mengambil Reader
dan membuat file InputStream
.
Saya menemukan bug kuno yang meminta pengganti yang sesuai, tetapi tidak ada yang seperti itu - sejauh yang saya tahu.
Solusi yang sering disarankan adalah dengan menggunakan java.lang.String.getBytes()
masukan untuk java.io.ByteArrayInputStream
:
public InputStream createInputStream(String s, String charset)
throws java.io.UnsupportedEncodingException {
return new ByteArrayInputStream(s.getBytes(charset));
}
tapi itu berarti mewujudkan seluruh String
memori sebagai array byte, dan mengalahkan tujuan streaming. Dalam kebanyakan kasus, ini bukan masalah besar, tetapi saya sedang mencari sesuatu yang akan mempertahankan maksud dari sebuah aliran - bahwa sesedikit mungkin data terwujud (kembali) dalam memori.
sumber
new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))
Jika Anda tidak keberatan dengan ketergantungan pada paket commons-io , maka Anda dapat menggunakan metode IOUtils.toInputStream (String teks) .
sumber
Ada adaptor dari Apache Commons-IO yang menyesuaikan dari Reader ke InputStream, yang diberi nama ReaderInputStream .
Kode contoh:
Referensi: https://stackoverflow.com/a/27909221/5658642
sumber
Menurut saya, cara termudah untuk melakukan ini adalah dengan mendorong data melalui Writer:
Implementasi JVM Saya menggunakan data yang didorong dalam 8K potongan, tetapi Anda dapat memiliki beberapa pengaruh pada ukuran buffer dengan mengurangi jumlah karakter yang ditulis pada satu waktu dan memanggil flush.
Alternatif untuk menulis bungkus CharsetEncoder Anda sendiri untuk menggunakan Writer untuk menyandikan data, meskipun itu adalah sesuatu yang sulit untuk dilakukan dengan benar. Ini harus menjadi implementasi yang andal (jika tidak efisien):
sumber
Nah, salah satu cara yang mungkin adalah:
PipedOutputStream
PipedInputStream
OutputStreamWriter
sekitarPipedOutputStream
(Anda dapat menentukan pengkodean dalam konstruktor)OutputStreamWriter
dapat dibaca dariPipedInputStream
!Tentu saja, ini tampak seperti cara yang agak hackish untuk melakukannya, tetapi setidaknya itu adalah cara.
sumber
Solusinya adalah dengan menggulung sendiri, membuat
InputStream
implementasi yang kemungkinan besar akan digunakanjava.nio.charset.CharsetEncoder
untuk menyandikan setiapchar
atau potonganchar
s menjadi array byte untuk yangInputStream
diperlukan.sumber
Anda dapat mengambil bantuan dari perpustakaan org.hsqldb.lib.
sumber
Saya tahu ini adalah pertanyaan lama tetapi saya sendiri memiliki masalah yang sama hari ini, dan inilah solusi saya:
sumber