天天看點

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