如何将字符串写入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
写入其中。 相反,您需要获取String
的byte[]
,然后将它们写入流中。
public void print(String s){ o.write(s.getBytes()); }
有关支持的写入数据类型的更多信息,请参阅OutputStream java文档。
我建议更好的建议是确保您在构造函数中提供的OutputStream
是BufferedOutputStream
,因为这将提高代码的性能。 它的工作原理是缓冲内存中的一些数据,并将其以大块写入磁盘而不是许多较小的写入。
这是BufferedOutputStream的java文档
我认为其他答案缺少一个重要的观点/问题。
你真的应该使用OutputStream吗?
OutputStream
和InputStream
类层次结构用于写入和读取面向字节的数据。 但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
类; 这通常更好,因为您可以指定要使用的编码,避免任何平台依赖性。