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"));
}