Mam kilka odbiorników wyjściowych, które implementują OutputStream. Może to być PrintStream zapisujący na standardowe wyjście lub do pliku, albo może to być zapis do pamięci lub innego miejsca docelowego wyjściowego; w związku z tym określiłem OutputStream jako argument () w metodzie.
Teraz otrzymałem String. Jaki jest tutaj najlepszy sposób pisania do strumieni?
Czy powinienem po prostu użyć Writer.write (message.getBytes ())? Mogę podać bajty, ale jeśli strumień docelowy jest strumieniem znaków, to czy będzie konwertowany automatycznie?
Czy zamiast tego muszę używać tutaj niektórych strumieni mostowych?
Odpowiedzi:
Strumienie (
InputStream
iOutputStream
) przesyłają dane binarne . Jeśli chcesz zapisać ciąg w strumieniu, musisz najpierw przekonwertować go na bajty, czyli innymi słowy zakodować . Możesz to zrobić ręcznie (jak sugerujesz) za pomocą tejString.getBytes(Charset)
metody, ale powinieneś jej unikaćString.getBytes()
, ponieważ używa ona domyślnego kodowania JVM, którego nie można wiarygodnie przewidzieć w przenośny sposób.Zwykłym sposobem zapisywania danych znakowych w strumieniu jest jednak umieszczenie strumienia w a
Writer
(często aPrintWriter
), który dokonuje konwersji za Ciebie, gdy wywołujesz jego metodęwrite(String)
(lubprint(String)
). Odpowiednim opakowaniem dla InputStreams jest czytnik .PrintStream
jest specjalnąOutputStream
implementacją w tym sensie, że zawiera również metody, które automatycznie kodują ciągi znaków (wykorzystuje wewnętrznie program zapisujący). Ale to wciąż jest strumień. Możesz bezpiecznie opakować swój strumień w program zapisujący, bez względu na to, czy jest toPrintStream
implementacja strumienia, czy inna. Nie ma niebezpieczeństwa podwójnego kodowania.Przykład PrintWriter z OutputStream:
źródło
PrintWriter
jest jak używanieString.getBytes()
. Używa dowolnego losowego kodowania, które jest domyślne dla maszyny JVM. Więc działa tylko wtedy, gdy masz szczęście.OutputStream zapisuje bajty, String zapewnia znaki. Musisz zdefiniować zestaw znaków, aby zakodować ciąg do bajtu []:
Zmień
UTF-8
na wybrany przez siebie zestaw znaków.źródło
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Możesz utworzyć PrintStream zawijający się wokół swojego OutputStream, a następnie po prostu wywołać jego print (String):
źródło
Z założenia należy to zrobić w następujący sposób:
źródło
w.close()
to również się zamknieout
.Owiń swoje OutputStream za pomocą PrintWriter i użyj metod drukowania tej klasy. Biorą strunę i wykonują pracę za Ciebie.
źródło
Możesz użyć Apache Commons IO :
źródło
IOUtils.write(String data, OutputStream output, Charset encoding)
jest zaimplementowany jakooutput.write(data.getBytes(Charsets.toCharset(encoding)))
, więc może być, jeśli zakodowany ciąg nie zmieści się w tablicy bajtów