Java 将字符串写入输出流

Java 将字符串写入输出流,java,io,stream,outputstream,Java,Io,Stream,Outputstream,我有几个输出侦听器正在实现OutputStream。 它可以是写入标准输出或文件的PrintStream,也可以是写入内存或任何其他输出目标;因此,我在方法中将OutputStream指定为(一个)参数 现在,我收到了字符串。在这里写入流的最佳方式是什么 我应该只使用Writer.write(message.getBytes())?我可以给它字节,但如果目标流是字符流,那么它会自动转换吗 我需要在这里使用一些桥接流吗?用a包装输出流,并在该类上使用print方法。它们接收字符串并为您完成工作。您

我有几个输出侦听器正在实现
OutputStream
。 它可以是写入标准输出或文件的
PrintStream
,也可以是写入内存或任何其他输出目标;因此,我在方法中将
OutputStream
指定为(一个)参数

现在,我收到了
字符串
。在这里写入流的最佳方式是什么

我应该只使用
Writer.write(message.getBytes())
?我可以给它字节,但如果目标流是字符流,那么它会自动转换吗


我需要在这里使用一些桥接流吗?

用a包装输出流,并在该类上使用print方法。它们接收字符串并为您完成工作。

您可以创建一个环绕输出流的打印流,然后调用它的print(字符串):

流(
InputStream
OutputStream
)传输二进制数据。如果要将字符串写入流,必须首先将其转换为字节,或者换句话说,对其进行编码。您可以使用
String.getBytes(Charset)
方法手动(如您所建议的)完成这项工作,但是您应该避免使用
String.getBytes()
方法,因为该方法使用JVM的默认编码,无法以可移植的方式可靠地预测

不过,将字符数据写入流的通常方法是将流包装在一个(通常是a)中,当您调用其(或)方法时,它会为您进行转换。InputStreams的对应包装器是

PrintStream
是一种特殊的
OutputStream
实现,因为它还包含自动编码字符串的方法(它在内部使用编写器)。但它仍然是一条小溪。无论是
PrintStream
还是其他流实现,您都可以使用writer安全地包装流。没有双重编码的危险

具有OutputStream的PrintWriter示例:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}

OutputStream写入字节,String提供字符。您需要定义字符集以将字符串编码为字节[]:

outputStream.write(string.getBytes(Charset.forName("UTF-8")));
UTF-8
更改为您选择的字符集。

方法如下:

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush
您可以使用:


我不确定,但这听起来像是你在尝试重新发明轮子,你看过Java Base API和Commons IO API了吗?PrintStream使用什么字符集来转换为字节?用以下行追加<代码>ByteArrayOutputStream outputStream=新建ByteArrayOutputStream()
.getBytes(StandardCharsets.UTF_8)
有点干净请注意
w.close()
也将关闭
out
。我更喜欢这个答案,因为它提供了明确的编码规范!我建议使用现有的预定义编码,比如StandardCharsets.UTF_8,而不是字符串文字(“UTF-8”)。因此使用
PrintWriter
就像使用
String.getBytes()
。它使用JVM默认的任何随机编码。因此,它只有在幸运的情况下才起作用。
IOUtils.write(字符串数据,OutputStream输出,字符集编码)
实现为
output.write(data.getBytes(Charsets.toCharset(编码)))
,因此,如果编码的字符串不能放入字节数组,它可能会起作用
OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush
try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}