633

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

但是有更好的方法吗?我只想做个测试!

4

5 回答 5

663

我会用一个ByteArrayOutputStream. 完成后,您可以致电:

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

或更好:

baos.toString( codepage );

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

该方法toString()仅接受 aString作为codepage参数(支持 Java 8)。

于 2008-10-19T20:15:38.930 回答
50

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

于 2008-10-19T20:23:26.997 回答
27

这很好用

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 的方式,只需要两个方法调用就可以了。

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

于 2009-06-20T20:13:22.413 回答
18

这就是我最终做的事情:

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.

于 2008-11-03T21:04:55.117 回答
6
baos.toString(StandardCharsets.UTF_8);

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

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

于 2020-05-19T05:48:13.223 回答