如何将字符串写入OutputStream

如何创建实现OutputStream并将内容写入其中的类?

例如,以下打印方法是错误的,不会编译。 有哪些选择或更好的技术?

 public class FooBarPrinter{ private OutputStream o; public FooBarPrinter(OutputStream o){ this.o=o; } public void print(String s){ o.write(s); } } 

通用OutputStream无法直接将String写入其中。 相反,您需要获取Stringbyte[] ,然后将它们写入流中。

 public void print(String s){ o.write(s.getBytes()); } 

有关支持的写入数据类型的更多信息,请参阅OutputStream java文档。

我建议更好的建议是确保您在构造函数中提供的OutputStreamBufferedOutputStream ,因为这将提高代码的性能。 它的工作原理是缓冲内存中的一些数据,并将其以大块写入磁盘而不是许多较小的写入。

这是BufferedOutputStream的java文档

我认为其他答案缺少一个重要的观点/问题。

你真的应该使用OutputStream吗?

OutputStreamInputStream类层次结构用于写入和读取面向字节的数据。 但Java字符串不是面向字节的。 它们是面向字符的(第一次近似),Java中的字符是16位Unicode代码单元。

将字符写入字节流时,JVM必须进行转换以将字符编码为字节。 事实上,有很多可能的方法可以做到这一点。 例如,UTF-8将序列中的每个字符编码为一个或多个字节,Latin-1或ASCII将字符子集编码为单个字节,并将其他字符编码为(可能)问号。 等等。

现在,有可能写出这样的东西:

  public void print(String s){ o.write(s.getBytes()); } 

但它有一个问题。 问题是String上的getBytes()方法使用JVM的默认字符编码方案来进行转换。 而这(默认编码方案)取决于JVM启动的环境。 所以代码根据环境做不同的事情。 现在你可以通过指定charset来解决这个问题:

  public void print(String s){ o.write(s.getBytes("UTF-8")); } 

但如果你在很多地方打电话给getBytes,这会很麻烦。

如果您正在进行大量基于文本的输出,则最好使用Writer API而不是OutputStream API。 Writer API及其实现处理引擎盖下的转换……并且更加一致和有效。

最后一点是,有其他API可以帮助您进行基于文本的输出。

  • BufferedWriter类(以及BufferedOutputStream )通过在输出过程中引入内存缓冲来支持高效输出。 这样可以节省系统调用,尤其是在执行大量小写操作时。
  • PrintWriter类提供了许多方便的方法,也消除了处理IOExceptions的需要。 (如果发生IOException, PrintWriter会记录它。有一种方法可以测试是否发生了exception。这可能有用或危险,具体取决于你正在做什么…)

要写出字符串,请查看PrintStream类。 您可以看到一个类的示例,它可以执行您想要的操作。

此外,您可以使用其中一个PrintStream构造函数包装OutputStream

 public class FooBarPrinter{ private PrintStream p; public FooBarPrinter(OutputStream o){ p = new PrintStream(o); } public void print(String s){ p.print(s); } } 

编辑 :请注意,您也可以像上面的PrintStream一样使用PrintWriter类; 这通常更好,因为您可以指定要使用的编码,避免任何平台依赖性。