如何将 outputStream 转换为字节数组?
Posted
技术标签:
【中文标题】如何将 outputStream 转换为字节数组?【英文标题】:How to convert outputStream to a byte array? 【发布时间】:2014-04-18 12:20:02 【问题描述】:如何将 OutputStream 转换为字节数组?我发现首先我需要将此 OutputStream 转换为 ByteArrayOutputStream。这个 OutputStream 类中只有 write() 方法,我不知道该怎么做。有什么想法吗?
【问题讨论】:
使用toByteArray提取字节 严格来说,你不能。输出流是输出流是输出流。一旦它存在,您可以将它包装在 PrintStream 或其他东西中。 【参考方案1】:创建一个ByteArrayOutputStream
。
通过调用toByteArray()
获取其内容
Reference
【讨论】:
谢谢。拯救了我的一天 对于像我这样一无所知的人:ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.writeTo(myOutputStream);
baos.toByteArray();
【参考方案2】:
如果提供的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
的调用 - 例如,如果只需要“转换”为字节数组。
更详细的讨论可以在another *** question找到。
【讨论】:
【参考方案3】:你需要做两件事
使用 ByteArrayOutputStream 写入它 使用 toByteArray(),你会得到内容为 byte[]您甚至可以按照here 所述扩展它
【讨论】:
【参考方案4】:您可以简单地将您的输出流声明为ByteArrayOutputStream
,然后使用ByteArrayOutputStream#toByteArray()
。
【讨论】:
【参考方案5】:如果你尝试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
【讨论】:
以上是关于如何将 outputStream 转换为字节数组?的主要内容,如果未能解决你的问题,请参考以下文章