arraycopy vs ByteArray io class
In Beijing on 2007-7-15
在IO功能开发中,常常需要涉及对字节数组的处理。Java语言提供有多种方式可供使用,在这里介绍其中的两种方式,System.arraycopy方法和使用ByteArray 相关IO类,并对它们的使用做一个基本的对比,提供给大家一个简单的参考使用。
在java语言中处理字节数组,我们常常会用到System类的arraycopy方法,此方法提供了java系统级别的数组复制功能,性能要高于我们自行复制数组的方式。但作为一个比较底层的方法,它没有提供缓存的功能,并且需要频繁的调用5个入参来作处理。因此对于数组的处理即显繁琐,又在性能方面略有不足。
在java提供的io类中,有两个ByteArrayInputStream、ByteArrayOutputStream,把对数组的操作封装为io功能来作处理,即减少了调用方面的难度,同时也在其内部实现采用缓存的方式。相比与第一种方法,每一次复制均需要重新开辟一个新的内存空间,则更加有效。
下面是对两种代码方式的一个比较,分布使用两种方式操作一次常见的数组复制操作。
使用arraycopy实现代码:
//读取数据包长度 byte[] buf = new byte[LEN_DATA_LEN]; in.read(buf); int dateLen = Integer.parseInt(new String(buf)); //读取数据包 byte[] bufData = new byte[dateLen]; in.read(bufData); byte[] bufAll = new byte[buf.length + bufData.length]; System.arraycopy(buf, 0, bufAll, 0, buf.length); System.arraycopy(bufData, 0, bufAll, buf.length, bufData.length); |
使用io类实现代码:
//读取数据包长度 byte[] buf = new byte[LEN_DATA_LEN]; in.read(buf); int dateLen = Integer.parseInt(new String(buf)); //读取数据包内容 byte[] bufData = new byte[dateLen]; in.read(bufData); //创建输出字节流对象 ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); outBuf.write(buf); outBuf.write(bufData); byte[] bufAll = outBuf.toByteArray(); |
对于上面两种方式感觉如何?也许对于简单的程序来说,并没有太大的差异。但是如果在你的代码中存在大量的数组操作,也许修改成使用io类,避免到处使用一堆参数的arraycopy方法更加直观,并且如果你的操作方式中如果存在循环处理,则采用第二中方式,会充分利用缓存功能,使得程序更加有效。
有兴趣可以参考java中的ArrayBute的两个io类的实现,实际上是对arraycopy方法的又一次封装。