如何将字符串写入OutputStream

use*_*257 11 java string outputstream

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

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

public class FooBarPrinter{
    private OutputStream o;
    public FooBarPrinter(OutputStream o){
        this.o=o;
    }

    public void print(String s){        
        o.write(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

wat*_*ios 23

泛型OutputStream不具备String直接写入它的能力.相反,您需要获取其中byte[]的内容String,然后将其写入流中.

public void print(String s){ 
    o.write(s.getBytes());
}
Run Code Online (Sandbox Code Playgroud)

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

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

这是BufferedOutputStream的java文档


Ste*_*n C 9

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

你真的应该使用OutputStream吗?

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

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

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

  public void print(String s){ 
      o.write(s.getBytes());
  }
Run Code Online (Sandbox Code Playgroud)

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

  public void print(String s){ 
      o.write(s.getBytes("UTF-8"));
  }
Run Code Online (Sandbox Code Playgroud)

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

如果您正在进行大量基于文本的输出,则更好的方法是使用WriterAPI而不是OutputStreamAPI.该WriterAPI及其实现方式处理引擎罩下的转换...和更稳定和高效.

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

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