本文正在参加「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…