繁体   English   中英

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

[英]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 写入它
  • 使用 toByteArray(),你会得到内容为 byte[]

你甚至可以像这里提到的那样扩展它

您可以简单地将输出流声明为ByteArrayOutputStream然后使用ByteArrayOutputStream#toByteArray()

如果您尝试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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM