读取未知大小字节流的方法

有一个InputStream,你需要把它的内容全部读到内存里,用一个byte[]存 储。怎么做?开一个大小为s的byte数组,然后读取一直到空间用完,然后开一个大小是2s的数组,把旧数组内容复制进来然后继续读。如果反复一直到数组 足够大。这应该是能想到最简单的解决方法。不过JDK提供了一个更fancy的工具来帮助我们完成这件事:ByteArrayOutputStream 。顾名思义,就是把字节流写到一个byte数组中。下面的例子展示了如何实际操作:

 

private byte[] readInputStream(InputStream in) { byte[] buffer = new byte[4096]; ByteArrayOutputStream out = new ByteArrayOutputStream(); int readSize; while((readSize = in.read(buffer)) >= 0) out.write(buffer, 0, readSize); in.close(); return out.toByteArray(); }

我猜ByteArrayOutputStream内部实现也用的是我上面说的方法,因为javadoc中有一句话“The buffer automatically grows as data is written to it.”。但是JDK提供的方法一般来说会比你自己写效率高一些,另外,有现成的方法为什么不拿来直接用呢?我就比较悲剧了,好多地方都是用自己写的方法 来读取的,比如读取图片上传啊,抓取URL这些。想改估计都改不过来了,整个一大悲剧。

你可能感兴趣的:(读取未知大小字节流的方法)