2011-12-28 47 views
4

我正在从C切换到Java。我想知道如何在字节缓冲区内找到一个字符串,有没有像java中的memchr?字节缓冲区只是部分字符串,其余的是原始字节,所以任何java方法都必须在字节+字符上工作。查找字节缓冲区内的字符串

我也在寻找类似于java中的strsep来分割字符串。

+0

java.lang.String中 - 法拆分()或子可以用来分割字符串。你应该一般阅读这个类的javadoc。 – Scorpion 2011-12-28 07:56:07

+0

你可以用'String.split()'拆分字符串' – 2011-12-28 07:56:57

+0

@Blub - bytebuffer的大小/长度是多少? – adatapost 2011-12-28 08:06:34

回答

0

一种选择是使用一个StringTokenizer,其可以根据给定的分隔符(或多个)的字符串分割成令牌可迭代集合。如果需要,令牌集合可以包含分隔符。例如:

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

预期结果:

ABCDEFGHIJKL

4

您需要的字符串编码成使用您的应用程序正确的字符编码字节。然后使用像Rabin-Karp或Boyer-Moore这样的字符串搜索算法来查找缓冲区内的结果字节序列。或者,如果你的缓冲区很小,你可以执行一个强力搜索。

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

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); 

这有一个不平凡的开销,因为它创建一个字符串。另一种方法是强力字符串搜索,它会更快,但需要时间来编写。

+0

此String构造函数已被弃用,因为它不考虑字符编码。建议:'String text = new String(bb.array(),0,bb.position(),charset);'其中'charset'是要使用的编码,或默认的'Charset.defaultCharset()' – mins 2014-08-24 13:11:59

+0

If你正在读取原始的C字符串,它很可能是ISO-8859-1编码,在这种情况下,这种方法很好。明确表示并不会损害表现,所以很明显可能会更好。 – 2014-08-24 16:57:11

1

Fastest way to find a string in a text file with 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();