将字符串写入输出流

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

现在,我已经收到了 String。在这里写入流的最佳方式是什么?

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

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

394410 次浏览

打印机包装 OutputStream 并在该类上使用 print 方法。他们接受一个字符串,并为你做工作。

你可以创建一个包裹 OutputStream 的 PrintStream,然后调用它的 print (String) :

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();

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

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

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

带 OutputStream 的 PrintWriter 示例:

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

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

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

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

你可使用 Apache Commons IO:

try (OutputStream outputStream = ...) {
IOUtils.write("data", outputStream, "UTF-8");
}