我有一個byte []的ArrayList,我想知道是否有可能使用來自Java *的流將其轉換爲byte []。 ArrayList中的所有數組具有相同的大小。在Java中使用流的byte []到byte []的ArrayList
ArrayList<byte[]> buffer = new ArrayList();
byte[] output = buffer.stream(...)
我有一個byte []的ArrayList,我想知道是否有可能使用來自Java *的流將其轉換爲byte []。 ArrayList中的所有數組具有相同的大小。在Java中使用流的byte []到byte []的ArrayList
ArrayList<byte[]> buffer = new ArrayList();
byte[] output = buffer.stream(...)
試試這個。
List<byte[]> list = Arrays.asList("abc".getBytes(), "def".getBytes());
byte[] result = list.stream()
.collect(
() -> new ByteArrayOutputStream(),
(b, e) -> {
try {
b.write(e);
} catch (IOException e1) {
throw new RuntimeException(e1);
}
},
(a, b) -> {}).toByteArray();
System.out.println(new String(result));
// -> abcdef
這是隻適用於API級別24和以上? –
@UmairM我不知道「API級別24」。但它需要Java 8或更高版本。 – saka1029
flatMap
應該是你在找什麼,理想情況下,應該是這樣的:
byte[] output = buffer.stream().flatMap(x -> Arrays.stream(x)).toArray(n -> new byte[n])
不過,這並不編譯。
隨着一些輔助方法:
private Byte[] box(final byte[] arr) {
final Byte[] res = new Byte[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
private byte[] unBox(final Byte[] arr) {
final byte[] res = new byte[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
下應該工作(但不是很漂亮或有效率):
byte[] output = unBox(buffer.stream().flatMap(x -> Arrays.stream(box(x))).toArray(n -> new Byte[n]));
您可以使用Guava library,它具有Bytes
支持轉換byte[]
到List<Byte>
和背部通過:
public static List<Byte> asList(byte... backingArray)
和
public static byte[] toArray(Collection<? extends Number> collection)
另一種選擇是簡單地重複和複製陣列,一個接一個,到一個大字節[],在我看來,在接受的答案中的代碼更簡單,更直接更...
public static void main(String[] args) {
List<byte[]> list = Arrays.asList("abc".getBytes(), "def".getBytes());
byte[] flattened= flatByteList(list);
System.out.println(new String(flattened)); // abcdef
}
private static byte[] flatByteList(List<byte[]> list) {
int byteArrlength = list.get(0).length;
byte[] result = new byte[list.size() * byteArrlength]; // since all the arrays have the same size
for (int i = 0; i < list.size(); i++) {
byte[] arr = list.get(i);
for (int j = 0; j < byteArrlength; j++) {
result[i * byteArrlength + j] = arr[j];
}
}
return result;
}
concat所有的字節[]? – azro
是的。我想要在一個唯一的字節數組ArrayList中的所有字節。 – daniboy000
相關:[在Java 8中,是否有ByteStream類?](// stackoverflow.com/q/32459683) – 4castle