|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
在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); // } }} 返回类别: 教程 上一教程: OSS报表系统实训笔记 下一教程: 如何快速成为Java高手 您可以阅读与"对Reader进行token的类,可以访入多个split进行解析"相关的教程: · 一个stmt多个rs进行操作引起的ResultSet已经关闭错误 · 一个进行Base64编码的类。 · JAVA构造函数运行解析 · 可以使用多个jsp定制标签在JSP中达到接近servelt的处理效果 · 用STRUTS上传多个文件的方式 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |