155

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

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

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

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

4

6 回答 6

161

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

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

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();
}
于 2010-11-01T13:05:20.960 回答
114

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

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

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

于 2010-11-01T14:48:00.047 回答
34

您可以创建一个环绕您的 OutputStream 的 PrintStream,然后将其称为 print(String):

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();
于 2010-11-01T13:04:02.850 回答
24

按照设计,它是这样完成的:

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush
于 2015-11-04T17:57:46.703 回答
12

用PrintWriter包装您的 OutputStream并使用该类的打印方法。他们接受一个字符串并为您完成工作。

于 2010-11-01T13:00:22.527 回答
9

您可以使用Apache Commons IO

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}
于 2016-04-08T06:52:06.080 回答