将字符串写入输出流


139

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

现在,我已经收到了字符串。在此处写入流的最佳方法是什么?

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

我是否需要在这里使用一些桥接流?


2
我不确定,但这听起来像是您在尝试重新发明轮子,您是否浏览过Java Base API和Commons IO API?
posdef 2010年

Answers:


149

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

不过,将字符数据写入流的通常方法是将流包装在中Writer(通常是PrintWriter),当您调用其write(String)(或print(String))方法时,将为您进行转换。InputStreams的相应包装是Reader

PrintStreamOutputStream从某种意义上讲,它是一种特殊的实现,它还包含自动编码字符串的方法(它在内部使用编写器)。但这仍然是一条小溪。无论是PrintStreamStream实现还是其他Stream实现,都可以用writer安全地包装您的流。没有双重编码的危险。

具有OutputStream的PrintWriter的示例:

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

3
因此使用PrintWriter就像使用一样String.getBytes()。它使用碰巧是JVM默认值的任何随机编码。因此,只有在您幸运的情况下,它才有效。
ChristofferHammarström,

106

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

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

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


3
附加以下行。ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
萨希尔·帕特尔

32

您可以在OutputStream周围创建一个PrintStream包装,然后将其称为print(String):

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

2
PrintStream使用什么字符集转换为字节?
迪恩·希勒

20

通过设计,可以通过以下方式完成:

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush

3
请注意,这w.close()也会关闭out
富兰克林于

12

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.