IT-Swarm.Net

将OutputStream获取为String

将Java.io.OutputStream的输出管道传输到Java中的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();
  }
}

但有更好的方法吗?我只想进行测试!

534
Adrian Mouat

我会使用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参数(Stand Java 8)。

566
Horcrux7

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

44
Joe Liversedge

这很好用

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

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

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

这对于生产使用来说是非常浪费的,转换的方式太多而且有点松散。这只是为了证明你完全有可能创建一个自定义的OuputStream并输出一个字符串。但是只需要使用Horcrux7方式,仅使用两个方法调用就可以了。

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

22
alcardenas

这是我最终做的事情:

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

13
Adrian Mouat