问题
我有几个输出侦听器正在实现OutputStream。它可以是写入stdout或文件的PrintStream,也可以是写入内存或任何其他输出目的地;因此,我将OutputStream指定为方法中的(a)参数。
现在,我收到了String。在这里写入流的最佳方式是什么?
我应该只使用Writer.write(message.getBytes())吗?我可以给它字节,但如果目标流是字符流,那么它会自动转换吗?
我需要在这里使用一些桥流吗?
#1 热门回答(125 赞)
Streams(InputStream
和OutputStream
)transferbinarydata。如果要将字符串写入流,则必须先将其转换为字节或其他wordsencodeit。你可以使用String.getBytes(Charset)
方法手动(如你所述)执行此操作,但你应该避免使用String.getBytes()
方法,因为它使用JVM的默认编码,无法以可移植的方式可靠地预测。
但是,将字符数据写入流的常用方法是将流包装在aWriter
(通常是aPrintWriter
)中,当你调用其write(String)
(或print(String)
)方法时,它会为你进行转换。 InputStreams的相应包装器是aReader。
PrintStream
是一个特殊的OutputStream
实现,因为它还包含自动编码字符串的方法(它在内部使用编写器)。但它仍然是一个流。你可以安全地使用编写器封装你的流,无论它是否是某个其他流实现。没有双重编码的危险。
PrintStream的PrintWriter示例:
try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
p.println("Hello");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
#2 热门回答(84 赞)
OutputStream写入字节,String提供字符。你需要定义Charset以将字符串编码为byte []:
outputStream.write(string.getBytes(Charset.forName("UTF-8")));
将1UTF-8
改为你选择的字符集。
#3 热门回答(31 赞)
你可以创建一个围绕OutputStream的PrintStream,然后只需调用它的print(String):
final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();