2011-12-10 28 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非常全面,并且已经包含了很好的例子。也就是说,它也接受分隔符 - 但作为正则表达式,请注意。