如何将 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 ReflectionOutputStream 转换为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 转换为字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

OutputStream 和 Writer

JAVA中OUTPUTSTREAM中方法WRITE用法

如何将char数组转换为字节数组?

如何将字节数组转换为字符串[重复]

如何将字节数组转换为流 [重复]

如何将字节数组转换为图片[关闭]