Jaki jest najlepszy sposób na przesłanie danych wyjściowych z pliku java.io.OutputStream do ciągu znaków w Javie?
Powiedz, że mam metodę:
writeToStream(Object o, OutputStream out)
Który zapisuje pewne dane z obiektu do podanego strumienia. Chcę jednak, aby dane wyjściowe zostały przetworzone na ciąg znaków tak łatwo, jak to możliwe.
Zastanawiam się nad napisaniem takiej klasy (nieprzetestowane):
class StringOutputStream extends OutputStream {
StringBuilder mBuf;
public void write(int byte) throws IOException {
mBuf.append((char) byte);
}
public String getString() {
return mBuf.toString();
}
}
Ale czy jest lepszy sposób? Chcę tylko przeprowadzić test!
Odpowiedzi:
Chciałbym użyć
ByteArrayOutputStream
. Na koniec możesz zadzwonić:albo lepiej:
Dla
String
konstruktoracodepage
może to byćString
instancja lub java.nio.charset.Charset . Możliwą wartością jest java.nio.charset.StandardCharsets.UTF_8 .Sposób
toString()
akceptuje tylkoString
jakocodepage
parametr (stand Java 8).źródło
defaultCharset
nie jest lepsze niż całkowite zignorowanie zestawu znaków - musisz dowiedzieć się, co to jest przed użyciemtoString
StandardCharsets.UTF_8
jest, aCharset
nieString
. Ponadto parametr jest wywoływanycharsetName
, a niecodepage
.Lubię bibliotekę Apache Commons IO. Spójrz na jego wersję ByteArrayOutputStream , która ma również
toString(String enc)
metodętoByteArray()
. Korzystanie z istniejących i zaufanych komponentów, takich jak projekt Commons, pozwala na zmniejszenie kodu i łatwiejsze rozszerzanie i ponowne przeznaczanie.źródło
To działało ładnie
wywołanie metody = >>
marshaller.marshal( (Object) toWrite , (OutputStream) output);
następnie, aby wydrukować ciąg lub uzyskać go, po prostu odwołaj się do samego strumienia „wyjściowego” Jako przykład, wydrukuj ciąg do konsoli = >>
System.out.println(output);
FYI: moje wywołanie metody
marshaller.marshal(Object,Outputstream)
służy do pracy z XML. Nie ma znaczenia dla tego tematu.Jest to bardzo marnotrawne do użytku produkcyjnego, jest zbyt wiele konwersji i jest nieco luźne. Zostało to po prostu zakodowane, aby udowodnić, że można całkowicie utworzyć niestandardowy OuputStream i wyprowadzić ciąg. Ale po prostu idź Horcrux7 i wszystko jest dobrze z zaledwie dwoma wywołaniami metod.
A świat żyje w innym dniu ...
źródło
Oto co skończyłem:
Gdzie os jest a
ByteArrayOutputStream
.źródło
"UTF-8"
zStandardCharsets.UTF_8
.Java 14 - https://docs.oracle.com/
źródło