組合兩個或多個字節數組
一、簡介
作為 Java 開發人員,我們可能會遇到想要連接兩個或多個字節數組的情況。在本教程中,我們將探索幾種連接兩個或多個字節數組的方法。
我們將從普通的 Java 類和方法開始。然後,我們將看看一些外部庫,如 Guava 和 Apache Commons Collections 來組合字節數組.
2. 使用純 Java
在以下所有示例中,我們將考慮以下兩個字節數組:
byte[] first = {69, 121, 101, 45, 62, 118, 114};
byte[] second = {58, 120, 100, 46, 64, 114, 103, 117};
要存儲這兩個串聯的數組,我們需要一個新的結果數組:
byte[] combined = new byte[first.length + second.length];
預期的結果數組如下:
byte[] expectedArray = {69, 121, 101, 45, 62, 118, 114, 58, 120, 100, 46, 64, 114, 103, 117};
在幾個示例中,我們將研究允許我們組合兩個以上數組的方法。我們將再考慮一個用於連接的字節數組:
byte[] third = {55, 66, 11, 111, 25, 84};
在這種情況下,三個數組串聯後的預期結果數組如下:
byte[] expectedArray = {69, 121, 101, 45, 62, 118, 114, 58, 120, 100, 46, 64, 114, 103, 117, 55, 66, 11, 111, 25, 84};
2.1.使用System.arraycopy()
arrayCopy()
是[System](https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/lang/System.html#arraycopy(java.lang.Object,int,java.lang.Object,int,int))
類中的靜態方法。它從指定的源數組複製數組或數組的子序列,從指定位置開始,到目標數組的指定位置。
此方法接受源數組和目標數組、數組中的位置和長度作為複制數組元素所需的參數。讓我們看看它的簽名:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
我們將了解這些參數的含義:
-
src
是源數組 -
srcPos
是源數組中的起始位置 -
dest
是目標數組 -
destPos
是目標數組中的起始位置 -
length
是要復制的數組元素的數量
讓我們使用arrayCopy()
方法將其複製到我們的combined
數組:
System.arraycopy(first, 0, combined, 0, first.length);
System.arraycopy(second, 0, combined, first.length, second.length);
assertArrayEquals(expectedArray, combined);
如果我們運行上面的測試,它就會通過。
2.2.使用ByteBuffer
ByteBuffer
是一個擴展了java.nio.Buffer
的 Java 類。我們可以用它來組合兩個或多個字節數組:
ByteBuffer buffer = ByteBuffer.wrap(combined);
buffer.put(first);
buffer.put(second);
buffer.put(third);
combined = buffer.array();
assertArrayEquals(expectedArray, combined);
同樣,如果我們運行它,測試就會通過。
2.3.使用自定義方法
我們可以通過編寫自定義邏輯來連接兩個字節數組。例如,我們可以通過將索引與第一個數組的長度進行比較來插入結果數組:
for (int i = 0; i < combined.length; ++i) {
combined[i] = i < first.length ? first[i] : second[i - first.length];
}
assertArrayEquals(expectedArray, combined);
當我們運行它時,我們看到上面的測試通過了。
3. 外部圖書館
我們可以使用幾個外部庫來連接兩個字節數組。我們將看看最受歡迎的。
3.1.使用番石榴
讓我們首先在 pom.xml 中添加 Google 的 Guava Maven 依賴項pom.xml:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
我們將使用 Guava 的[com.google.common.primitives.Bytes.concat()](https://github.com/google/guava/blob/4aaebca4e1f05891ec8e5ff0183cdde9894815f3/guava/src/com/google/common/primitives/Bytes.java) .
這是它的簽名:
public static byte[] concat(byte[]... arrays)
我們可以使用上述方法組合兩個或多個字節數組:
byte[] combined = Bytes.concat(first, second, third);
assertArrayEquals(expectedArray, combined);
如我們所見,生成的combined
數組包含傳遞給concat()
方法的所有數組的元素。
3.2.使用 Apache Commons
要開始使用 Apache Commons Lang 3,我們首先需要添加Maven 依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
我們將使用 Apache Commons Lang 的[org.apache.commons.lang3.ArrayUtils](https://github.com/apache/commons-lang/blob/8eef2fc92229e47889e66774edd3df0a9f6d6281/src/main/java/org/apache/commons/lang3/ArrayUtils.java)
:
public static byte[] addAll(final byte[] array1, final byte... array2)
讓我們看看如何使用上述方法組合兩個字節數組:
byte[] combined = ArrayUtils.addAll(first, second);
assertArrayEquals(expectedArray, combined);
同樣,如果我們運行它,測試就會通過。
4。結論
在這篇簡短的文章中,我們首先了解了幾種使用普通 Java 連接兩個字節數組的方法。後來,我們還使用了 Guava 和 Apache Commons 等外部庫來連接兩個字節數組。
與往常一樣,可以在 GitHub 上找到本文的完整代碼示例。