Java 如何将字符串写入OutputStream

Java 如何将字符串写入OutputStream,java,string,outputstream,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);

如何创建一个类,该类接受
OutputStream
的实现并将内容写入其中

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

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

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

通用的
OutputStream
无法直接向其写入
字符串。相反,您需要获取
字符串的
字节[]
,然后将它们写入流

public void print(String s){ 
    o.write(s.getBytes());
}
有关支持的写入数据类型的更多信息,请参阅java文档

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


以下是java文档,用于编写字符串,请查看该类。您可以看到一个类的示例,它实现了您想要的功能

此外,您还可以使用以下方法包装
OutputStream


EDIT:请注意,您也可以使用与上述
PrintStream
相同的方式使用该类;这通常更好,因为您可以指定要使用的编码,避免任何平台依赖性。

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

您真的应该使用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启动的环境。因此,该代码根据环境的不同执行不同的操作。现在,您可以通过指定字符集来修复此问题:

  public void print(String s){ 
      o.write(s.getBytes("UTF-8"));
  }
但是如果你在很多地方调用getBytes,这会变得很麻烦

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

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

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

您应该1)查看OutputStream API并使用其可用的方法,2)如果您有错误,请在此处发布错误,这样我们就不必猜测错误所在。例如,API将向您显示没有名为write(…)的OutputStream方法接受字符串参数,因此您不能只编写一个并期望它工作。相反,您必须使用可用的方法。应该注意的是,
PrintStream
处理异常的方式不同:“与其他输出流不同,
PrintStream
从不抛出
IOException
;相反,异常情况只是设置了一个内部标志,可以通过
checkError()进行测试
method.@GregKopff:是的,现在注意到了。谢谢
  public void print(String s){ 
      o.write(s.getBytes("UTF-8"));
  }