提问人:Adrian Mouat 提问时间:10/20/2008 最后编辑:JonikAdrian Mouat 更新时间:9/6/2022 访问量:725746
将 OutputStream 转换为字符串
Get an OutputStream into a String
问:
在 Java 中,将输出从 java.io.OutputStream 传递给 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 );
对于构造函数,可以是 java.nio.charset.Charset 的实例。可能的值为 java.nio.charset.StandardCharsets.UTF_8。String
codepage
String
该方法只接受 a 作为参数(参见 Java 8)。toString()
String
codepage
评论
defaultCharset
toString
StandardCharsets.UTF_8
是 ,而不是 .此外,该参数称为 ,而不是 。Charset
String
charsetName
codepage
我喜欢 Apache Commons IO 库。看看它的 ByteArrayOutputStream 版本,它有一个方法和 .使用现有的和受信任的组件,如Commons项目,可以让你的代码更小,更容易扩展和重新利用。toString(String enc)
toByteArray()
评论
这是我最终所做的:
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
这很有效
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);
仅供参考:我的方法调用用于处理 XML。它与这个话题无关。marshaller.marshal(Object,Outputstream)
这对于生产使用来说是非常浪费的,转换太多了,而且有点松散。这只是为了向您证明完全可以创建自定义 OuputStream 并输出字符串。但只要走 Horcrux7 的方式,只需两个方法调用就可以了。
世界生活在另一天......
评论
baos.toString(StandardCharsets.UTF_8);
通过使用命名字符集对字节进行解码,将缓冲区的内容转换为字符串。
Java 17 - https://docs.oracle.com/
这是我所做的(不要在生产中使用它,这不是很好!但它使修复多个错误变得更加容易。
创建一个包含异常的列表。
创建记录器以记录异常。
使用以下代码:
private static void exceptionChecker() 抛出 Exception { if(exceptionList.isEmpty()) 返回;无事可做 :)好消息
//create lock for multithreading synchronized (System.err){ //create new error stream ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream errorOut = new PrintStream(byteArrayOutputStream); //save standard err out PrintStream standardErrOut = System.err; try{ //set new error stream System.setErr(errorOut); exceptionList.forEach(exception -> { exception.printStackTrace(); System.err.println("<---------->"); }); } finally { //reset everything back to normal System.setErr(standardErrOut); //Log all the exceptions exceptionLogger.warning(byteArrayOutputStream.toString()); //throw final generic exception throw new Exception(); } }}
这并不好,因为您在 finally 块中抛出错误并且它会锁定错误流,但它适用于开发目的。
上一个:计算方法的执行时间
评论