我正在從C切換到Java。我想知道如何在字節緩衝區內找到一個字符串,有沒有像java中的memchr?字節緩衝區只是部分字符串,其餘的是原始字節,所以任何java方法都必須在字節+字符上工作。查找字節緩衝區內的字符串
我也在尋找類似於java中的strsep來分割字符串。
我正在從C切換到Java。我想知道如何在字節緩衝區內找到一個字符串,有沒有像java中的memchr?字節緩衝區只是部分字符串,其餘的是原始字節,所以任何java方法都必須在字節+字符上工作。查找字節緩衝區內的字符串
我也在尋找類似於java中的strsep來分割字符串。
String類有一個很好的分割法String.split
一種選擇是使用一個StringTokenizer
,其可以根據給定的分隔符(或多個)的字符串分割成令牌可迭代集合。如果需要,令牌集合可以包含分隔符。例如:
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);
這有一個不平凡的開銷,因爲它創建一個字符串。另一種方法是強力字符串搜索,它會更快,但需要時間來編寫。
此String構造函數已被棄用,因爲它不考慮字符編碼。建議:'String text = new String(bb.array(),0,bb.position(),charset);'其中'charset'是要使用的編碼,或默認的'Charset.defaultCharset()' – mins 2014-08-24 13:11:59
If你正在讀取原始的C字符串,它很可能是ISO-8859-1編碼,在這種情況下,這種方法很好。明確表示並不會損害表現,所以很明顯可能會更好。 – 2014-08-24 16:57:11
從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();
java.lang.String中 - 法拆分()或子可以用來分割字符串。你應該一般閱讀這個類的javadoc。 – Scorpion 2011-12-28 07:56:07
你可以用'String.split()'拆分字符串' – 2011-12-28 07:56:57
@Blub - bytebuffer的大小/長度是多少? – adatapost 2011-12-28 08:06:34