将outputStream转换为字节数组

时间:2017-03-28 22:21:38

标签: java java-io outputstream

如何获取outputStream的字节,或者如何将outputStream转换为字节数组?

2 个答案:

答案 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数组。即使ByteArrayOutputStreamOutputStream类也可以用作父类,需要更多的工作和一些假设(例如,关于reset()方法)。

在任何情况下,都必须有足够的内存来进行排水并使toByteArray()方法起作用。

相关问题