我有几个正在实现的输出侦听器OutputStream
。它可以是PrintStream
对标准输出或文件的写入,也可以是对内存或任何其他输出目标的写入;因此,我OutputStream
在方法中指定为 (an) 参数。
现在,我收到了String
。在这里写入流的最佳方式是什么?
我应该使用Writer.write(message.getBytes())
吗?我可以给它字节,但是如果目标流是字符流,那么它会自动转换吗?
我需要在这里使用一些桥流吗?
我有几个正在实现的输出侦听器OutputStream
。它可以是PrintStream
对标准输出或文件的写入,也可以是对内存或任何其他输出目标的写入;因此,我OutputStream
在方法中指定为 (an) 参数。
现在,我收到了String
。在这里写入流的最佳方式是什么?
我应该使用Writer.write(message.getBytes())
吗?我可以给它字节,但是如果目标流是字符流,那么它会自动转换吗?
我需要在这里使用一些桥流吗?
流 (InputStream
和OutputStream
) 传输二进制数据。如果要将字符串写入流,则必须首先将其转换为字节,或者换句话说对其进行编码。您可以使用该方法手动(按照您的建议)执行此操作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();
}
OutputStream 写入字节,String 提供字符。您需要定义 Charset 以将字符串编码为 byte[]:
outputStream.write(string.getBytes(Charset.forName("UTF-8")));
更改UTF-8
为您选择的字符集。
您可以创建一个环绕您的 OutputStream 的 PrintStream,然后将其称为 print(String):
final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();
按照设计,它是这样完成的:
OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
w.write("Hello, World!");
} // or w.close(); //close will auto-flush
用PrintWriter包装您的 OutputStream并使用该类的打印方法。他们接受一个字符串并为您完成工作。
您可以使用Apache Commons IO:
try (OutputStream outputStream = ...) {
IOUtils.write("data", outputStream, "UTF-8");
}