[英]How to convert outputStream to a byte array?
如何将 OutputStream 转换为字节数组? 我发现首先我需要将此 OutputStream 转换为 ByteArrayOutputStream。 这个 OutputStream 类中只有 write() 方法,我不知道该怎么做。 有什么想法吗?
创建一个ByteArrayOutputStream
。
通过调用toByteArray()
其内容
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.writeTo(myOutputStream);
baos.toByteArray();
如果提供的OutputStream
对象还不是ByteArrayOutputStream
,则可以将其wrap
在一个委托类中,该类将“抓取”提供给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();
}
}
为了减少开销,可以省略上述类中对super
的调用——例如,如果只需要“转换”为字节数组。
可以在另一个 StackOverflow 问题中找到更详细的讨论。
您可以简单地将输出流声明为ByteArrayOutputStream
然后使用ByteArrayOutputStream#toByteArray()
。
如果您尝试ByteArrayOutputStream bos=(ByteArrayOutputStream)outputStream
然后抛出ClassCastException
。 当我从HttpServletResponse
获得OutputStream
并且它是CoyoteOutputStream
时,我做到了。(您可以创建文件,所以不要创建文件临时)。
您可以使用Java Reflection
将OutputStream
转换为byte[]
:
byte[] bytes = this.getBytes(outStream);
/**
* Get byte from OutputStream
*
* @param outStream
* @return
*/
@SneakyThrows
private byte[] getBytes(OutputStream outStream) {
OutputBuffer outputBuffer = (OutputBuffer) this.getValueByName("ob", outStream);
ByteBuffer byteBuffer = (ByteBuffer) this.getValueByName("bb", outputBuffer);
return (byte[]) this.getValueByName("hb", byteBuffer);
}
/**
* Get value from property
*
* @param name
* @param value
* @return
*/
@SneakyThrows
@SuppressWarnings("unchecked")
private Object getValueByName(String name, Object value) {
List<Field> listFiled = new ArrayList<>();
if (value.getClass().getSuperclass() != null) {
listFiled.addAll(Arrays.asList(value.getClass().getSuperclass().getDeclaredFields()));
}
listFiled.addAll(Arrays.asList(value.getClass().getDeclaredFields()));
Optional<Field> fieldOb = listFiled.stream()
.filter(field -> StringUtils.equalsAnyIgnoreCase(name, field.getName()))
.findFirst();
if (fieldOb.isPresent()) {
Field field = fieldOb.get();
field.setAccessible(true);
return field.get(value);
}
return StringUtils.EMPTY; // FIXME
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.