Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在bytebuffer中查找字符串_Java_String_Bytebuffer - Fatal编程技术网

Java 在bytebuffer中查找字符串

Java 在bytebuffer中查找字符串,java,string,bytebuffer,Java,String,Bytebuffer,我正在从C转换到Java。我想知道如何在bytebuffer中找到字符串,java中是否有类似于memchr的东西?bytebuffer只是字符串的一部分,其余部分是原始字节,因此任何java方法都必须处理字节+字符 我还在java中搜索类似strep的东西来分割字符串。String类有一个很好的分割方法一个选项是使用,它可以根据给定的分隔符将字符串分割成一个可编辑的标记集合。如果需要,tokens集合可以包含分隔符。例如: String s = "abc:def-ghi|jkl"; Strin

我正在从C转换到Java。我想知道如何在bytebuffer中找到字符串,java中是否有类似于memchr的东西?bytebuffer只是字符串的一部分,其余部分是原始字节,因此任何java方法都必须处理字节+字符


我还在java中搜索类似strep的东西来分割字符串。

String类有一个很好的分割方法

一个选项是使用,它可以根据给定的分隔符将字符串分割成一个可编辑的标记集合。如果需要,tokens集合可以包含分隔符。例如:

String s = "abc:def-ghi|jkl";
StringTokenizer tokenizer = new StringTokenizer(s, ":-|");
while (tokenizer.hasMoreTokens()) {
  System.out.print(tokenizer.nextToken());
}
预期结果:

abcdefghijkl


您需要使用适用于应用程序的正确字符编码将字符串编码为字节。然后使用像Rabin Karp或Boyer Moore这样的字符串搜索算法在缓冲区中查找结果字节序列。或者,如果缓冲区很小,您可以只执行蛮力搜索


我不知道这些搜索算法的任何开源实现,它们也不是核心Java的一部分。

您可以将ByteBuffer转换为字符串,并使用indexOf,这可能会起作用

ByteBuffer bb = /* non-direct byte buffer */
String text = new String(bb.array(), 0, bb.position(), bb.remaing());
int index = text.indexOf(searchText);
由于它创建了一个字符串,因此会产生不小的开销。另一种选择是蛮力字符串搜索,它将更快,但需要花费时间进行写入。

来自:

我在MIMEParser中找到的最佳实现:

还需要:

  private void compileBoundaryPattern();

String-方法split()或substring可用于拆分字符串。一般来说,您应该阅读这个类的javadocs。您可以使用
string.split()
@Blub()拆分字符串-bytebuffer的大小/长度是多少?这不是一个好问题-因为它在一个类中包含两个问题。请将两者分开(使用拆分?:-)此字符串构造函数不推荐使用,因为它没有考虑字符编码。建议:
String text=新字符串(bb.array(),0,bb.position(),charset)
其中
charset
是要使用的编码,或者是默认的
charset.defaultCharset()
如果您正在读取原始C字符串,则很可能是ISO-8859-1编码的,在这种情况下,此方法很好。显式不会对性能造成太大的影响,所以清晰可能更好。这种方法的缺点和类似之处在于,您必须读取整个字符串,而不是流式解决方案。
  private void compileBoundaryPattern();