2010-11-01 141 views
96

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

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

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

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

+1

我不知道,但是这听起来像你试图在这里重新发明轮子,你有没有看过J? ava Base API以及Commons IO API? – posdef 2010-11-01 12:57:05

回答

118

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

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

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

实施例:

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

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

29

您可以创建一个在你的OutputStream一个PrintStream包装,然后就调用它的打印(串):

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

PrintStream使用什么字符集转换为字节? – 2016-01-31 15:56:59

73

的OutputStream写入字节,字符串提供了字符。您需要定义字符集编码字符串为byte []:

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

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

+0

附加下面一行。 'ByteArrayOutputStream outputStream = new ByteArrayOutputStream();' – 2017-12-27 09:22:25

11

By design它做这种方式:

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

请注意,'w.close()'也会关闭'out'。 – 2018-01-11 16:32:18