将 java.io.OutputStream 的输出通过管道传输到 Java 中的 String 的最佳方法是什么?
说我有方法:
writeToStream(Object o, OutputStream out)
它将某些数据从对象写入给定的流。但是,我想尽可能轻松地将此输出转换为字符串。
我正在考虑编写这样的课程(未经测试):
class StringOutputStream extends OutputStream {
StringBuilder mBuf;
public void write(int byte) throws IOException {
mBuf.append((char) byte);
}
public String getString() {
return mBuf.toString();
}
}
但是有更好的方法吗?我只想做个测试!
我会使用 ByteArrayOutputStream
。完成后,您可以致电:
new String( baos.toByteArray(), codepage );
或更好:
baos.toString( codepage );
对于 String
构造函数,codepage
可以是 String
或 java.nio.charset.Charset 的实例。可能的值为 java.nio.charset.StandardCharsets.UTF_8。
方法 toString()
仅接受 String
作为 codepage
参数(支持 Java 8)。
我喜欢 Apache Commons IO 库。查看它的 ByteArrayOutputStream 版本,它具有 toString(String enc)
方法和 toByteArray()
。使用像 Commons 项目这样的现有和受信任的组件可以让你的代码更小,更容易扩展和重新利用。
这很好用
OutputStream output = new OutputStream() {
private StringBuilder string = new StringBuilder();
@Override
public void write(int b) throws IOException {
this.string.append((char) b );
}
//Netbeans IDE automatically overrides this toString()
public String toString() {
return this.string.toString();
}
};
方法调用=>> marshaller.marshal( (Object) toWrite , (OutputStream) output);
然后打印字符串或获取它只是引用“输出”流本身作为示例,将字符串打印到控制台 =>> System.out.println(output);
仅供参考:我的方法调用 marshaller.marshal(Object,Outputstream)
用于处理 XML。与本主题无关。
这对于生产使用来说是非常浪费的,转换太多并且有点松散。这只是为了向您证明完全可以创建自定义 OuputStream 并输出字符串。但是只要走 Horcrux7 的方式,只需要两个方法调用就可以了。
世界生活在另一天......
这就是我最终做的事情:
Obj.writeToStream(toWrite, os);
try {
String out = new String(os.toByteArray(), "UTF-8");
assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
fail("Caught exception: " + e.getMessage());
}
其中 os 是 ByteArrayOutputStream
。
"UTF-8"
替换为 StandardCharsets.UTF_8
。
baos.toString(StandardCharsets.UTF_8);
通过使用命名字符集解码字节,将缓冲区的内容转换为字符串。
Java 17 - https://docs.oracle.com/
defaultCharset
并不比完全忽略字符集好 - 您需要在使用toString
之前找出它是什么StandardCharsets.UTF_8
是Charset
,而不是String
。此外,该参数称为charsetName
,而不是codepage
。