2011-12-10 41 views
0

我相信我沒有正確使用String Tokenizer。這裏是我的代碼:字符串標記器在java中的錯誤用法

buffer = new byte[(int) (end - begin)]; 
       fin.seek(begin); 
       fin.read(buffer, 0, (int) (end - begin)); 

       StringTokenizer strk = new StringTokenizer(new String(buffer), 
           DELIMS,true); 

正如你可以看到我讀線的一大塊從一個文件(結束和開始都行號),我的數據transfering到字符串標記。我的分隔符是:

DELIMS = "\r\n "; 

因爲我想分隔在它們​​之間有空格的單詞,或者在下一行。然而,這段代碼有時也會分隔整個單詞。什麼可能是解釋?我的DELIMS字符串是否構思錯誤?

而且我傳遞「真」作爲參數傳遞給標記生成器,因爲我想爲令牌,以及要處理的delimitators。(我想這是因爲我想算我目前在該行)

你可以幫我嗎。非常感謝。

+0

此操作是否在循環中執行? – dasblinkenlight

+4

請停止使用StringTokenizer:「StringTokenizer是一個遺留類,由於兼容性原因而保留,儘管在新代碼中不鼓勵使用它。建議任何尋求此功能的人都使用String或java.util.regex包的拆分方法。「:http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html – zengr

+0

此操作由多個線程使用,複製的工作人員的形式 – biggdman

回答

1

您總是可以將輸入流包裝在LineNumberReader中。這將跟蹤你的線路號碼。 LineNumberReader擴展BufferedReader,它有一個readLine()方法。通過這個,你可以使用一個普通的StringTokenizer來獲得你的詞作爲記號。您可以使用正則表達式或Scanner,但對於這種情況,StringTokenizer對於初學者來說更易於理解和更快速。

您必須擁有一個RandomAccessFile。你沒有指定,但我猜你基於你使用的方法。嘗試類似:

byte [] buffer = ...; // you know how to get this. 
ByteArrayInputStream stream = new ByteArrayInputStream(buffer); 

// if you have java.util.Scanner 
{ 
    int lineNumber = 0; 
    Scanner s = new Scanner(stream); 

    while (s.hasNextLine()) { 
     lineNum++; 
     String line = s.nextLine(); 
     System.out.format("I am on line %s%n", lineNum); 
     Scanner lineScanner = new Scanner(line); 

     while (lineScanner.hasNext()) { 
      String word = lineScanner.next(); 
      // do whatever with word 
     } 
    } 
} 

// if you don't have java.util.Scanner, or want to use StringTokenizer 
{ 
    LineNumberReader reader = new LineNumberReader(
          new InputStreamReader(stream)); 
    String line = null; 

    while ((line = reader.nextLine()) != null) { 
     System.out.println("I am on line " + reader.getLineNumber()); 
     StringTokenizer tok = new StringTokenizer(line); 

     while (tok.hasMoreTokens()) { 
      String word = tok.nextToken(); 
      // do whatever with word 
     } 
    } 
} 
2

首先,您將字節轉換爲字符串的方法有點可疑,而且這種整體方法效率不高,特別是對於較大的文件。

您是否需要使用StringTokenizer?如果不是,我強烈建議使用Scanner。我會給你提供一個例子,但會要求你只是引用Javadocs,而這些Javadocs非常全面,並且已經包含了很好的例子。也就是說,它也接受分隔符 - 但作爲正則表達式,請注意。