如何获取outputStream的字节,或者如何将outputStream转换为字节数组?
答案 0 :(得分:3)
对于@Obicere评论示例:
ByteArrayOutputStream btOs = new ByteArrayOutputStream();
btOs.write("test bytes".getBytes());
String restoredString = new String(btOs.toByteArray());
System.out.println(restoredString);
答案 1 :(得分:3)
从理论的角度来看(即,无论在实践中作为用例是否有意义),这是一个有趣的问题,基本上需要实现像
这样的方法public abstract byte[] convert(OutputStream out);
Java
OutputStream
类,顾名思义,仅支持I / O的重写write()
方法,write()
方法获取整数(表示1个字节)或者byte
数组,它发送到输出的内容(例如,文件)。
例如,以下代码将data
数组中已存在的字节保存到output.txt
文件中:
byte[] data = ... // Get some data
OutputStream fos = new FileOutputStream("path/to/output.txt");
fos.write(data);
为了获取给定OutputStream
将输出的所有数据并将其放入byte
数组(即,进入byte[]
对象),相应的OutputStream
对象被实例化,应该保持存储通过其write()
方法处理的所有字节,并提供一个特殊的方法,例如toByteArray()
,它将在调用时全部返回。
这正是ByteArrayOutputStream
类所做的,使convert()
方法变得微不足道(并且不必要):
public byte[] convert(ByteArrayOutputStream out) {
return out.toByteArray();
}
对于任何其他类型的OutputStream
,并非本质上支持类似转换为byte[]
对象,在OutputStream
耗尽之前,即之前无法进行转换已完成对write()
方法的所需调用。
如果可以做出(已完成写入)这样的假设,并且如果可以替换原始OutputStream
对象,那么一个选项是将其包装在一个基本上&#的委托类中34;扶手"将通过其write()
方法提供的字节数。例如:
public class DrainableOutputStream extends FilterOutputStream {
private final ByteArrayOutputStream buffer;
public DrainableOutputStream(OutputStream out) {
super(out);
this.buffer = new ByteArrayOutputStream();
}
@Override
public void write(byte b[]) throws IOException {
this.buffer.write(b);
super.write(b);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
this.buffer.write(b, off, len);
super.write(b, off, len);
}
@Override
public void write(int b) throws IOException {
this.buffer.write(b);
super.write(b);
}
public byte[] toByteArray() {
return this.buffer.toByteArray();
}
}
调用内部"缓冲区的write()
方法" (ByteArrayOutputStream
)在调用原始流之前(反过来,可以通过super
访问,甚至可以通过this.out
访问,因为FilterOutputStream
的相应参数是protected
)。这确保了字节将被缓冲,即使在写入原始流时存在异常。
为了减少开销,可以省略对上述类中super
的调用 - 例如,如果只有"转换"需要一个byte
数组。即使ByteArrayOutputStream
或OutputStream
类也可以用作父类,需要更多的工作和一些假设(例如,关于reset()
方法)。
在任何情况下,都必须有足够的内存来进行排水并使toByteArray()
方法起作用。