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);
    }
}
wat*_*ios 23
泛型OutputStream不具备String直接写入它的能力.相反,您需要获取其中byte[]的内容String,然后将其写入流中.
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());
  }
但它有一个问题.问题是a上的getBytes()方法String使用JVM的默认字符编码方案来进行转换.而这(默认编码方案)取决于JVM启动的环境.所以代码根据环境做不同的事情.现在你可以通过指定charset来解决这个问题:
  public void print(String s){ 
      o.write(s.getBytes("UTF-8"));
  }
但如果你在很多地方打电话给getBytes,这会很麻烦.
如果您正在进行大量基于文本的输出,则更好的方法是使用WriterAPI而不是OutputStreamAPI.该WriterAPI及其实现方式处理引擎罩下的转换...和更稳定和高效.
最后一点是,有其他API可以帮助您进行基于文本的输出.
BufferedWriter类(以及BufferedOutputStream)通过引入内存缓冲到输出进程支持高效的输出.这样可以节省系统调用,尤其是在执行大量小写操作时.PrintWriter类提供一大堆的便利方法,也消除了需要处理的IOExceptions.(如果发生IOException,则PrintWriter记下它.有一种方法可以测试是否发生了异常.这可能有用或危险,具体取决于你正在做什么......)| 归档时间: | 
 | 
| 查看次数: | 51706 次 | 
| 最近记录: |