2011-12-28 84 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();