我想从ByteArrayInputStream获取内部字节数组。我不想扩展该类或将其写入另一个字节数组。是否有一个实用工具类可以帮助我做到这一点?
谢谢,
答案 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()方法进行复制外,不提供对内部数组的访问。