天天看点

arraycopy vs ByteArray io class

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方法的又一次封装。