我有一个字节缓冲区,我需要从中找到该缓冲区中字符"/n">的位置。该字节缓冲区中可能存在许多"/n">,我需要找到所有这些位置。有什么方法不需要转换为字节数组并使用 Java 8 循环访问它?
>ByteBuffer
类提供绝对get操作,可以访问任何有效索引处的值。例如,ByteBuffer#get(int)
接受一个索引并返回该索引处的字节。它这样做不会改变缓冲区的位置,这意味着您的代码不会有任何副作用。下面是一个查找单个字节的所有索引的示例:
public static int[] allIndicesOf(ByteBuffer buf, byte b) {
return IntStream.range(buf.position(), buf.limit())
.filter(i -> buf.get(i) == b)
.toArray();
}
这样可以避免将信息复制到byte[]
中,并使ByteBuffer
处于与提供给方法时相同的状态。另请注意,缓冲区仅从其当前位置搜索到其限制。如果要搜索整个缓冲区,请使用range(0, buf.capacity())
。
下面是另一个示例,除了这个示例允许您在缓冲区中搜索"子数组":
public static int[] allIndicesOf(ByteBuffer buf, byte[] b) {
if (b.length == 0) {
return new int[0];
}
return IntStream.rangeClosed(buf.position(), buf.limit() - b.length)
.filter(i -> IntStream.range(0, b.length).allMatch(j -> buf.get(i + j) == b[j]))
.toArray();
}
该代码用于获取位置。如果我只想删除在该字节缓冲区的字节缓冲区中找到的 ASCII 字符"10",是否有可能?
下面是删除指定字节的所有匹配项的示例:
public static void removeAll(ByteBuffer buf, byte b) {
for (int i = buf.position(); i < buf.limit(); i++) {
// find first occurrence
if (buf.get(i) == b) {
// copy every remaining byte which != 'b' over
for (int j = i + 1; j < buf.limit(); j++) {
if (buf.get(j) != b) {
buf.put(i++, buf.get(j));
}
}
// update limit of buffer (implicitly causes outer for loop to exit)
buf.limit(i);
}
}
}