无法重新读取Lucene令牌流

无法重新读取Lucene令牌流,lucene,Lucene,我使用的是Lucene 4.6,显然不清楚如何重用令牌流,因为我遇到了一个例外: java.lang.IllegalStateException: TokenStream contract violation: reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). Please see Javadocs of TokenStream class f

我使用的是Lucene 4.6,显然不清楚如何重用令牌流,因为我遇到了一个例外:

java.lang.IllegalStateException: TokenStream contract violation: reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). Please see Javadocs of TokenStream class for more information about the correct consuming workflow.
@Test
public void list() throws Exception {
  String text = "here are some words";
  TokenStream ts = new StandardTokenizer(Version.LUCENE_46, new StringReader(text));
  listTokens(ts);
  listTokens(ts);
}

public static void listTokens(TokenStream ts) throws Exception {
  CharTermAttribute termAtt = ts.addAttribute(CharTermAttribute.class);
  try {
    ts.reset();
    while (ts.incrementToken()) {
      System.out.println("token text: " + termAtt.toString());
    }
    ts.end();
  }
  finally {
    ts.close();
  }
}
在第二次传球开始时。我读过Javadoc,但是我仍然缺少一些东西。以下是引发上述异常的简单示例:

java.lang.IllegalStateException: TokenStream contract violation: reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). Please see Javadocs of TokenStream class for more information about the correct consuming workflow.
@Test
public void list() throws Exception {
  String text = "here are some words";
  TokenStream ts = new StandardTokenizer(Version.LUCENE_46, new StringReader(text));
  listTokens(ts);
  listTokens(ts);
}

public static void listTokens(TokenStream ts) throws Exception {
  CharTermAttribute termAtt = ts.addAttribute(CharTermAttribute.class);
  try {
    ts.reset();
    while (ts.incrementToken()) {
      System.out.println("token text: " + termAtt.toString());
    }
    ts.end();
  }
  finally {
    ts.close();
  }
}
我试着不调用
TokenStream.end()
TokenStream.close()
认为它们可能只应该在最后调用,但我得到了相同的异常


有人能提供建议吗?

异常列出了一个可能的问题,即多次调用
reset()
。这在
标记器
的实现中是明确不允许的。由于
java.io.Reader
api不能保证所有子类都支持
reset()
操作,因此
标记器
不能假定传入的
读取器可以重置


您可以简单地构造一个新的令牌流,或者我相信您可以调用
令牌发生器.setReader(Reader)
(在这种情况下,您肯定必须先
关闭()
它)。

谢谢,femtoRgon。重新设置读卡器起作用了。我误解了异常中的multiple reset()限制,认为这意味着不连续多次调用它,回想起来,这是一个奇怪的限制。请用代码编写您所做的。这个答案毫无意义。对于初学者来说,Tokernizer.setReader不是一个静态方法。@ArunavSanyal,刚刚看到了这一点。已经快2年了,但我想我所做的就是在对
listTokens(ts)
的两次调用之间添加
ts.setReader(newstringreader(text))