将字符串写入输出流

2022-08-31 07:26:49

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

现在,我收到了 .写入此处流的最佳方式是什么?String

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

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


答案 1

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

但是,将字符数据写入流的常用方法是将流包装在编写器(通常是 PrintWriter)中,当您调用其 write(String)(print(String))方法时,它会为您执行转换。InputStreams 的相应包装器是读取器

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

带有输出流的 PrintWriter 示例:

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

答案 2

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

outputStream.write(string.getBytes(Charset.forName("UTF-8")));

更改为您选择的字符集。UTF-8


推荐