CharTokenizer..
Analyzer WhitespaceAnalyzer = new WhitespaceAnalyzer();
TokenStream stream = analyzer.tokenStream("contents", new StringReader(text));
Token token = stream.next();
바로 이 next...!!
stream.next는 TokenStream의 next 메서드가 호출되고 이는
public Token next() throws IOException {
Token result = next(new Token());
if (result != null) { //이것들은 무엇을 하기 위한 로직인고..;;
Payload p = result.getPayload();
if (p != null) {
result.setPayload((Payload) p.clone());
}
}
return result;
}
이렇게 생겼다.
첫 라인을 보면, next(Token) 메서드를 호출하는데 이는 CharTokenizer 클래스에서
오버라이드한 메서드가 호출된다.
보면, 문장을 읽어들여서 isTokenChar(char)를 사용하여 토큰단위로 분리해내고
Token.termLength, Token.startOffset, enfOffset을 설정해 주는듯 하다...
그런데..
소스 중
buffer = token.resizeTermBuffer(1+length);
이부분이 무엇을 위한 부분인지 이해가 되지 않고...
token.termText() 를 실행했을때
어떻게 토큰으로 잘려진 단어가 나오는지도 잘 모르겠다..
token.termText()는
public final String termText() {
if (termText == null && termBuffer != null)
termText = new String(termBuffer, 0, termLength);
return termText;
}
으로 되는데..
메서드를 봐서는 termBuffer에 잘려진 토큰 단어가
들어가 있어야 한다는 것인데.. (0부터 termLength만큼 가져오니까...)
그것을 어디서 설정해 주는지 당최 모르겠다..어흑..
알았다!!!!
CharTokenizer에서
public final Token next(Token token) throws IOException {
char[] buffer = token.termBuffer();
...
이 부분을 통해 buffer에 Token 클래스의 termBuffer의 메모리를 할당하여
CharTokenizer에서 각각의 캐릭터를 하나하나 buffer에 할당하게 되면
자동적으로 Token의 termBuffer도 같은 값을 갖도록 되어있다.
그래서
char[] buffer = token.termBuffer();
이거 타고 들어가면 주구장창 Token 클래스의 termBuffer를 초기화 하는거라..
위에 모르겠다고 한
buffer = token.resizeTermBuffer(1+length);
이 부분은 단순히 처음 들어온 단어(토큰)가 너무 길때 이것을 새로 리사이징
해주는 것이고..
첫 스페이스나 char가 아닌 글자가 들어오면
token.termLength = length;
token.startOffset = start;
token.endOffset = start+length;
이 값들을 할당하면서
Token을 리턴하는데 이때 이미
char[] buffer 와 Token의 char[] termBuffer는 같은 메모리를 참조하고 있기 때문에
자동적으로 리턴된 Token은 잘려진 termText를 가질 수 있게 된다.