Write string to output stream
Solution 1
Streams (InputStream
and OutputStream
) transfer binary data. If you want to write a string to a stream, you must first convert it to bytes, or in other words encode it. You can do that manually (as you suggest) using the String.getBytes(Charset)
method, but you should avoid the String.getBytes()
method, because that uses the default encoding of the JVM, which can't be reliably predicted in a portable way.
The usual way to write character data to a stream, though, is to wrap the stream in a Writer
, (often a PrintWriter
), that does the conversion for you when you call its write(String)
(or print(String)
) method. The corresponding wrapper for InputStreams is a Reader.
PrintStream
is a special OutputStream
implementation in the sense that it also contain methods that automatically encode strings (it uses a writer internally). But it is still a stream. You can safely wrap your stream with a writer no matter if it is a PrintStream
or some other stream implementation. There is no danger of double encoding.
Example of PrintWriter with OutputStream:
try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
p.println("Hello");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
Solution 2
OutputStream writes bytes, String provides chars. You need to define Charset to encode string to byte[]:
outputStream.write(string.getBytes(Charset.forName("UTF-8")));
Change UTF-8
to a charset of your choice.
Solution 3
You can create a PrintStream wrapping around your OutputStream and then just call it's print(String):
final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();
Solution 4
By design it is to be done this way:
OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
w.write("Hello, World!");
} // or w.close(); //close will auto-flush
Solution 5
Wrap your OutputStream with a PrintWriter and use the print methods on that class. They take in a String and do the work for you.
Related videos on Youtube
yart
Updated on March 17, 2021Comments
-
yart about 3 years
I have several output listeners that are implementing
OutputStream
. It can be either aPrintStream
writing to stdout or to a File, or it can be writing to memory or any other output destination; therefore, I specifiedOutputStream
as (an) argument in the method.Now, I have received the
String
. What is the best way to write to streams here?Should I just use
Writer.write(message.getBytes())
? I can give it bytes, but if the destination stream is a character stream then will it convert automatically?Do I need to use some bridge streams here instead?
-
posdef over 13 yearsI am not sure but this sounds like you are trying to reinvent the wheel here, have you looked through the Java Base API, as well as Commons IO API?
-
-
Dean Hiller over 8 yearsWhat character set is PrintStream using to convert to bytes?
-
Sahil Patel over 6 yearsAppend with the following line.
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-
Franklin Yu over 6 yearsNote that
w.close()
will closeout
as well. -
Christoffer Hammarström about 6 yearsSo using
PrintWriter
is just like usingString.getBytes()
. It uses whatever random encoding that happens to be the default of the JVM. So it only works if you're lucky. -
Šarūnas almost 6 years
IOUtils.write(String data, OutputStream output, Charset encoding)
is implemented asoutput.write(data.getBytes(Charsets.toCharset(encoding)))
, so it may if an encoded string can't fit in a byte array -
bb1950328 over 3 years
.getBytes(StandardCharsets.UTF_8)
is a little bit cleaner -
HooNose almost 3 yearsI prefer this answer because it provides an explicit encoding specification! And I recommend using the existing predefined encodings, like StandardCharsets.UTF_8 instead of String literals ("UTF-8").