在java。util中的java.io.StringTokenizer类能对单个字符串进行解析,在jdk1.4中的split也可以对单个字符串进行解析,但都不能对Reader流进行解析,在多个字符解析的时候也不能返回分割两个字符串的字符串,下面这个类就是为了解决这个问题而写的,还可以在准备包括一些最基本的解析类型,*和?
可以设置多个split进行解析,在解析的时候返回对应的分割字符串
程序可以直接运行
/*
* 创建日期 2005-4-4
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.csii.template;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.Iterator;
/**
* @author wsl
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class ReaderToken implements Iterator {
private Reader reader = null;//存放准备解析的字符流
private String[] splits = null;//准备用来分割字符流的token
private StringBuffer HasRead = new StringBuffer();//存放从流中已经读的字符
private String[] splitsSf = null;//由于可能存在一些统配符,所以此处存放统配符在token时的字符,比如在abcdefgh
/**
*
*/
public ReaderToken(Reader reader, String[] split) {
super();
this.reader = reader;
this.splits = split;
splitsSf = new String[split.length];
for (int i = 0; i < split.length; i++) {
splitsSf[i] = "";
}
}
/* (非 Javadoc)
* @see java.util.Iterator#hasNext()
*/
public boolean hasNext() {
if (indexOf() > -1) {
return true;
}
return false;
}
private int currentsplit = -1;
private int indexOf() {
currentsplit = -1;
int[] pos = new int[splits.length];
for (int i = 0; i < pos.length; i++) {
splitsSf[i] = "";
pos[i] = 0;
} //初试位置符号
try {
while (true) {
for (int j = 0; j < pos.length; j++) {
if (pos[j] >= splits[j].length()) {
currentsplit = j;
return currentsplit;
//如果当前pos里面的长度达到最splits里面的最大值,返回当前的split
}
}
char readchar = (char) reader.read();
if (readchar == -1) {
return currentsplit;
}
if (readchar == 65535) {
return currentsplit;
}
HasRead.append(readchar);
for (int i = 0; i < pos.length; i++) {
char splitposchar = splits[i].charAt(pos[i]);
if (splitposchar == readchar) {
pos[i]++;
splitsSf[i] += readchar;
} else if (splitposchar == '*') {
char nextchar = splits[i].charAt((pos[i] + 1));
//得到*后面一个字符,一般统配符都表示为1*2
if (nextchar == readchar) {
pos[i]++;
pos[i]++;
}
splitsSf[i] += readchar;
} else if (splitposchar == '?') {
pos[i]++;
splitsSf[i] += readchar;
} else {
pos[i] = 0;
splitsSf[i] = "";
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return -1;
}
/* (非 Javadoc)
* @see java.util.Iterator#next()
*/
public Object next() {
int i = HasRead.length() - splitsSf[currentsplit].length();
StringBuffer sf = new StringBuffer();
sf = this.HasRead;
HasRead = new StringBuffer();
// if(i<0){
// i=0;
// }
sf.setLength(i);
return sf;
}
public String getToken() {
return splits[this.currentsplit];
}
public String getTokenInReader() {
return splitsSf[currentsplit];
}
public Object getEnd() {
return this.HasRead;
}
/* (非 Javadoc)
* @see java.util.Iterator#remove()
*/
public void remove() {
}
public static void main(String[] args) throws IOException {
String[] a = new String[] { "a?a" };
String s = "cefaaasdbd";
ReaderToken token = new ReaderToken(new StringReader(s), a);
while (token.hasNext()) {
System.err.println("next---" + token.next());
System.err.println("token---" + token.getToken());
System.err.println(
"getTokenInReader---" + token.getTokenInReader());
}
System.err.println("end--" + token.getEnd());
// StringReader reader=new StringReader(s);
// char c;
// while((c=(char)reader.read())!=-1){
// System.err.println(c);
// System.out.println((long)c);
// }
}
}