Saya memiliki beberapa pendengar keluaran yang mengimplementasikan OutputStream. Ini bisa berupa PrintStream yang menulis ke stdout atau ke File, atau dapat menulis ke memori atau tujuan output lainnya; oleh karena itu, saya menetapkan OutputStream sebagai (an) argumen dalam metode ini.
Sekarang, saya telah menerima String. Apa cara terbaik untuk menulis ke streaming di sini?
Haruskah saya menggunakan Writer.write (message.getBytes ())? Saya bisa memberikannya byte, tetapi jika aliran tujuan adalah aliran karakter maka apakah akan dikonversi secara otomatis?
Apakah saya perlu menggunakan beberapa stream jembatan di sini?
Jawaban:
Streaming (
InputStream
danOutputStream
) mentransfer data biner . Jika Anda ingin menulis string ke stream, Anda harus terlebih dahulu mengubahnya menjadi byte, atau dengan kata lain menyandikannya . Anda dapat melakukannya secara manual (seperti yang Anda sarankan) menggunakanString.getBytes(Charset)
metode ini, tetapi Anda harus menghindariString.getBytes()
metode tersebut, karena itu menggunakan pengodean default JVM, yang tidak dapat diprediksi dengan andal dengan cara portabel.Namun, cara biasa untuk menulis data karakter ke stream adalah dengan membungkus stream dalam a
Writer
, (seringkali aPrintWriter
), yang melakukan konversi untuk Anda ketika Anda memanggil metodewrite(String)
(atauprint(String)
). Pembungkus yang sesuai untuk InputStreams adalah Pembaca .PrintStream
adalahOutputStream
implementasi khusus dalam arti bahwa itu juga berisi metode yang secara otomatis menyandikan string (menggunakan penulis internal). Tapi itu masih aliran. Anda dapat dengan aman membungkus aliran Anda dengan seorang penulis, tidak peduli apakah itu adalahPrintStream
implementasi aliran atau lainnya. Tidak ada bahaya pengkodean ganda.Contoh PrintWriter dengan OutputStream:
sumber
PrintWriter
sama seperti menggunakanString.getBytes()
. Ia menggunakan pengodean acak apa pun yang merupakan default JVM. Jadi itu hanya berfungsi jika Anda beruntung.OutputStream menulis byte, String menyediakan karakter. Anda perlu mendefinisikan Charset untuk menyandikan string ke byte []:
Ubah
UTF-8
ke rangkaian pilihan Anda.sumber
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Anda dapat membuat PrintStream membungkus OutputStream Anda dan kemudian panggil saja print itu (String):
sumber
Dengan desain itu harus dilakukan dengan cara ini:
sumber
w.close()
akan menutupout
juga.Bungkus OutputStream Anda dengan PrintWriter dan gunakan metode cetak pada kelas itu. Mereka menerima sebuah String dan melakukan pekerjaan untuk Anda.
sumber
Anda dapat menggunakan Apache Commons IO :
sumber
IOUtils.write(String data, OutputStream output, Charset encoding)
diimplementasikan sebagaioutput.write(data.getBytes(Charsets.toCharset(encoding)))
, jadi mungkin jika string yang dikodekan tidak dapat ditampung dalam array byte