将字符串写入输出流

时间:2010-11-01 12:54:16

标签: java stream

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

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

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

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

6 个答案:

答案 0 :(得分:140)

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

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

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

使用OutputStream的PrintWriter示例:

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

答案 1 :(得分:97)

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

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

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

答案 2 :(得分:32)

您可以创建一个围绕OutputStream的PrintStream,然后只需调用它的print(String):

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

答案 3 :(得分:15)

By design要做到这一点:

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

答案 4 :(得分:12)

使用PrintWriter包裹OutputStream并使用该类的print方法。他们接受一个字符串并为你完成工作。

答案 5 :(得分:8)

您可以使用Apache Commons IO

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