1.5 将OutputStream转换为字符串| Java Debug 笔记

294 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:将OutputStream转换为字符串

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

有更好的方法吗?

回答1:

这种方式成果显著:

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);来使用这个output。

当我需要打印字符串或者需要获取字符串时,仅需要使用output引用即可。举个栗子,将字符串打印到控制台

System.out.println(output);

回答2:

答主后来更正了自己的代码,这里直接写最终版

Obj.writeToStream(toWrite, byteArrayOutputStream);
try {
    String out = new String(os.toByteArray(), "StandardCharsets.UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());
}

回答3: 该位答主引用了Oracle的文档

Class ByteArrayOutputStream
//此类实现了 OutputStream类,使用字符数组存储数据。缓冲区随着数据写入而自动增长。提供方法
toByteArray()
和
toString()
// 和ArrayList的差不多的扩容方式
private void ensureCapacity(int minCapacity) {
        if (minCapacity - this.buf.length > 0) {
            this.grow(minCapacity);
        }

    }

private void grow(int minCapacity) {
    int oldCapacity = this.buf.length;
    int newCapacity = oldCapacity << 1;
    if (newCapacity - minCapacity < 0) {
        newCapacity = minCapacity;
    }

    if (newCapacity - 2147483639 > 0) {
        newCapacity = hugeCapacity(minCapacity);
    }

    this.buf = Arrays.copyOf(this.buf, newCapacity);
}


// toString 实现方式
public synchronized String toString() {
        return new String(this.buf, 0, this.count);
}

文章翻译自Stack Overflow :stackoverflow.com/questions/2…