从ByteArrayInputStream获取内部字节数组

时间:2010-11-30 16:12:56

标签: java

我想从ByteArrayInputStream获取内部字节数组。我不想扩展该类或将其写入另一个字节数组。是否有一个实用工具类可以帮助我做到这一点?

谢谢,

6 个答案:

答案 0 :(得分:15)

您无法访问相同的字节数组,但您可以轻松复制流的内容:

public byte[] read(ByteArrayInputStream bais) {
     byte[] array = new byte[bais.available()];
     bais.read(array);

     return array;
}

答案 1 :(得分:2)

扩展ByteArrayInputStream,然后您就可以访问protected字段。这是做到这一点的方式。提供构造函数以从参数中获取字节数组。

但是,您可能会发现装饰器模式更有帮助。

答案 2 :(得分:2)

使用Apache COmmons IO库(http://commons.apache.org/io/),您可以使用IOutils.toByteArray(java.io.InputStream input)

编辑:好的,我没理解这个问题......没有复制...... 也许是这样的:

byte[] buf = new byte[n];
ByteArrayInputStream input = new ByteArrayInputStream(buf);

将允许您保留对输入流

使用的缓冲区的引用

答案 3 :(得分:1)

没有。扩展类是唯一的方法(好吧,使用反射来绕过字段可见性,绝对不推荐)。

答案 4 :(得分:0)

内部字段受到保护,因此扩展很容易。如果确实不想,反射可能是另一种方式。这不是一个很好的解决方案,因为它依赖于ByteArrayInputStream的内部工作(例如知道该字段被称为buf)。你被警告了。

ByteArrayInputStream bis = ...
Field f = ByteArrayInputStream.class.getDeclaredField("buf");
f.setAccessible(true);
byte[] buf = (byte[])f.get(bis);

答案 5 :(得分:-3)

不,除了通过toByteArray()方法进行复制外,不提供对内部数组的访问。