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

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


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

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

或更好:

baos.toString( codepage );

对于String构造函数,代码页可以是String或java.nio.charset.Charset的实例。可能的值为java.nio.charset.StandardCharsets.UTF_8。

方法toString()只接受String作为代码页参数(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 =>>编组器。marshal((Object) toWrite, (OutputStream) output);

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

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

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

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


baos.toString(StandardCharsets.UTF_8);

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

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


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

Create a list that holds Exceptions. Create a logger to log exceptions. Use the code below: private static void exceptionChecker() throws Exception { if(exceptionList.isEmpty()) return; //nothing to do :) great news //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块中抛出了一个错误,并且它锁定了错误流,但它适用于开发目的。