在ByteBuffer中查找字符串

4

我正在从C转向Java。我想知道如何在ByteBuffer中查找字符串,是否有类似于java中的memchr的方法?ByteBuffer仅部分为字符串,其余为原始字节,因此任何Java方法都必须在字节和字符上工作。

我还在寻找类似于Java中的strsep来拆分字符串的方法。


java.lang.String - 可以使用split()或substring()方法来拆分字符串。通常应该阅读此类的javadoc文档。 - Scorpion
你可以使用 String.split() 函数来分割字符串。 - juergen d
@Blub - ByteBuffer 的大小/长度是多少? - KV Prajapati
这不是一个好问题,因为它包含了两个问题。请分开这两个问题(使用split函数? :-)) - Zordid
5个回答

5
您可以将 ByteBuffer 转换为字符串,并使用 indexOf 方法,这通常可以正常工作。
ByteBuffer bb = /* non-direct byte buffer */
String text = new String(bb.array(), 0, bb.position(), bb.remaing());
int index = text.indexOf(searchText);

这个操作会创建一个字符串,因此会产生一些开销。另一种方法是使用暴力字符串搜索,速度更快但需要花费一定时间编写代码。


这个字符串的构造函数已经被弃用了,因为它没有考虑字符编码。建议使用以下语句:String text = new String(bb.array(), 0, bb.position(), charset); 其中 charset 是要使用的编码或默认编码 Charset.defaultCharset() - mins
如果您正在阅读原始的C字符串,那么它很可能是ISO-8859-1编码,这种情况下该方法是可行的。明确表述不会对性能造成太大影响,因此清晰明了或许更好。 - Peter Lawrey
2
这种方法以及类似的方法的缺点是您必须读取整个字符串 - 而不是流式解决方案。 - Jmoney38

4
你需要使用适用于你的应用程序的正确字符编码将字符串编码为字节。然后使用字符串搜索算法,如Rabin-Karp或Boyer-Moore,在缓冲区中查找结果字节序列。或者,如果你的缓冲区很小,你可以进行暴力搜索。
我不知道这些搜索算法的任何开源实现,并且它们不是Java核心的一部分。

1

来自Java中查找文本文件中字符串的最快方式

我在MIMEParser中找到的最佳实现:https://github.com/samskivert/ikvm-openjdk/blob/master/build/linux-amd64/impsrc/com/sun/xml/internal/org/jvnet/mimepull/MIMEParser.java

/**
  * Finds the boundary in the given buffer using Boyer-Moore algo.
  * Copied from java.util.regex.Pattern.java
  *
  * @param mybuf boundary to be searched in this mybuf
  * @param off start index in mybuf
  * @param len number of bytes in mybuf
  *
  * @return -1 if there is no match or index where the match starts
  */

  private int match(byte[] mybuf, int off, int len) {

需要的还有:

  private void compileBoundaryPattern();

0

0
一种选择是使用StringTokenizer,它可以根据给定的分隔符将字符串拆分为可迭代的令牌集合。如果需要,令牌集合可以包含分隔符。例如:
String s = "abc:def-ghi|jkl";
StringTokenizer tokenizer = new StringTokenizer(s, ":-|");
while (tokenizer.hasMoreTokens()) {
  System.out.print(tokenizer.nextToken());
}

预期结果:

abcdefghijkl


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接