获取一个OutputStream到一个String中

在Java中,将输出从Java .io. outputstream管道到String的最佳方法是什么?

假设我有方法:

  writeToStream(Object o, OutputStream out)

将特定数据从对象写入给定流。但是,我希望尽可能容易地将此输出转换为String。

我正在考虑写一个这样的类(未经测试):

class StringOutputStream extends OutputStream {


StringBuilder mBuf;


public void write(int byte) throws IOException {
mBuf.append((char) byte);
}


public String getString() {
return mBuf.toString();
}
}

但是有没有更好的办法呢?我只想做个测试!

699193 次浏览

我会使用ByteArrayOutputStream。完成后,你可以调用:

new String( baos.toByteArray(), codepage );

或更好:

baos.toString( codepage );

对于String构造函数,codepage可以是Stringcharset的实例。一个可能的值是java.nio.charset.StandardCharsets.UTF_8

方法toString()只接受String作为codepage参数(适用于Java 8)。

我喜欢Apache Commons IO库。看一下它的ByteArrayOutputStream版本,它有一个toString(String enc)方法和toByteArray()方法。使用现有的可信组件(如Commons项目)可以使代码更小,更容易扩展和重新利用。

这是我最后做的:

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

这工作得很好

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

方法call =>> marshaller.marshal( (Object) toWrite , (OutputStream) output);

然后打印字符串或获取它只需引用“输出”流本身 例如,输出字符串到console =>> System.out.println(output);

供您参考:我的方法调用marshaller.marshal(Object,Outputstream)是用于处理XML的。这与这个话题无关。

这对于生产使用来说是非常浪费的,有太多的转换,它有点松散。这只是为了向您证明创建自定义outputstream并输出字符串是完全可能的。但只要走Horcrux7的方式,一切都很好,只有两个方法调用。

世界生活在另一天....

baos.toString(StandardCharsets.UTF_8);

通过使用命名字符集解码字节,将缓冲区的内容转换为字符串。

Java 17 - https://docs.oracle.com/

以下是我所做的(不要在生产中使用这个,这并不好!但它使修复多个错误变得更容易。)

  • 创建一个包含异常的列表。

  • 创建一个记录器记录异常。

  • 使用以下代码:

    私有静态无效exceptionChecker()抛出异常{ 如果(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块中抛出了一个错误,并且它锁定了错误流,但它适用于开发目的。