⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tools.java

📁 手机Wap浏览器源码
💻 JAVA
字号:
package com.gameislive.browser;

import java.io.InputStreamReader;
import java.util.Vector;
import javax.microedition.lcdui.Font;

/**
 * 主要用于解释文档、处理字符串的工具类
 * 
 * @author pan
 *
 */
public class Tools {

	static Font font;
	
	/**
	 * 清空Tools占用的内存
	 */
	public static void destroy(){
		font = null;
	}
	
	/**
	 * 规范化wml文档,一行一条完整语句,保存在Vector中<br> 
	 * @param reader
	 */
	public static Vector ToDocument(InputStreamReader reader) {
		
		// 下边为一个完整的,规范的WML文档
		
//		<?xml version="1.0" encoding="UTF-8"?>
//		<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
//		<wml>
//		<head>
//		<meta http-equiv="Cache-Control" content="no-cache" />
//		<meta http-equiv="Cache-Control" content="max-age=0" />
//		<meta http-equiv="Cache-Control" content="must-revalidate" />
//		</head>
//		<card id="misc" title="misc">
//		<onevent type="onenterforward" >
//		<go href="http://www.gameislive.com/live_wap/index.do" sendreferer="true" />
//		</onevent>
//		<p align="left">
//		loading... 
//		</p>
//		</card>
//		</wml>
		
		// 临时的,用于保存解释的文档
		// 文档是一行一行保存的,由于不确定有多少行,因此用Vector而不用Array
		// 默认32行,对小页面不足32行的可以少少提高速度
		Vector sv = new Vector(32);		
		
		String s = "";		
		do {
			String s1;
			if ((s1 = ReadLine(reader)) == null) {
				break;
			}
			s1 = s1.trim();
			if (s1.length() != 0) {
				if (s.length() > 0) {
					s = s + " ";
				}
				do {
					int i;
					if ((i = s1.indexOf("<")) != -1) {
						s = s + s1.substring(0, i);
						if (s.length() > 0) {
							sv.addElement(s);
						}
						s = "<";
						s1 = s1.substring(i + 1);
					}
					if ((i = s1.indexOf(">")) != -1) {
						s = s + s1.substring(0, i + 1);
						if (s.length() > 0) {
							sv.addElement(s);
						}
						s = "";
						s1 = s1.substring(i + 1);
					}
				} while (s1.indexOf("<") != -1 || s1.indexOf(">") != -1);
				s = s + s1;
			}
		} while (true);
		if (s.length() > 0) {
			sv.addElement(s);
		}		
		return sv;
	}
	
	/**
	 * 从流读取文挡,流末尾则返回null
	 * @param reader
	 * @return
	 */
    public static String ReadLine(InputStreamReader reader) {
        StringBuffer stringbuffer = new StringBuffer();
        int i = -1;
        do {
            try {
                if ((i = reader.read()) == -1) {
                    break;
                }
                char c = (char) i;
                if (c == '\n') {
                    break;
                }
                if (c != '\r') {
                    stringbuffer.append(c);
                }
                continue;
            }
            catch (Exception exception) {
            }
            break;
        } while (true);
        if (stringbuffer.length() == 0) {
            if (i == -1) {
                return null;
            } else {
                return "";
            }
        } else {
            return stringbuffer.toString();
        }
    }
    
    /**
     * 将文档中的由&#x表示的转义标记转换成目标字符串
     * @param s
     * @return
     */
	public static String Convert(String s) {
		do {
			int k1;
			if ((k1 = s.indexOf("&#x")) == -1) {
				break;
			}
			int k2 = k1;
			int j4 = s.length();
			int j5 = k1;
			do {
				if (j5 >= j4) {
					break;
				}
				if (s.charAt(j5) == ';') {
					k2 = j5;
					break;
				}
				j5++;
			} while (true);
			if (k2 == k1) {
				break;
			}
			String str = "\\n" + s.substring(k1 + 3, k2);
			str = UnicodeToString(str);
			s = s.substring(0, k1) + str + s.substring(k2 + 1);
		} while (true);
		return s;
	}

	/**
	 * unicode编码形式的字符串转成String,比如<br>
	 * "6211" "7684"则转换成 "我" "的"
	 * @param s
	 * @return
	 */
	public static String UnicodeToString(String s) {
		if (s == null) {
			return null;
		}
		StringBuffer result = new StringBuffer();
		int tempI, i, ch;
		for (i = 0; i < s.length(); i++) {
			if ((ch = s.charAt(i)) == '\\') // 如果是Unicode编码(开始是),则将它转换为汉字
			{
				tempI = i;
				i += 2;
				while (s.length() > i && s.charAt(i) == 'u') {
					i++;
				}
				if (s.length() >= i + 4) {
					ch = Integer.parseInt(s.substring(i, i + 4), 16); // 将Unicode16进制数转换为10进制
					i += 3;

				} else {
					i = tempI;
				}
			}
			// 对于汉字,将它从整形数据转换成字符后,附在result后,对于英文字符,直接使用就行
			result.append((char) ch);
		}
		return result.toString();
	}

	/**
	 * 将wml文档中一些特别的转义字符串转换成标记
	 * @param s
	 * @return
	 */
	public static String ReplaceTagString(String s){
		s = RepString(s, "&copy;", "(c)");
		s = RepString(s, "&amp;", "&");
		s = RepString(s, "&lt;", "<");
		s = RepString(s, "&gt;", ">");
		s = RepString(s, "&nbsp;", " ");
		s = RepString(s, "&apos;", "'");
		s = RepString(s, "&quot;", "\"");
		s = RepString(s, "&#039;", "'");
		s = RepString(s, "&#8226;", "\u25aa");
		return s;
	}
	
	/**
	 * 将一段文字根据指定的行宽度分行保存在Vector中返回
	 * @param infostr
	 * @param width
	 */
	public static Vector DoLine(String infostr, int width){

		Vector dealedText = new Vector();
		
		String tmpStr;
	 	int tmpint;  
	 	try{
		 	while (true){
		 		tmpint = ChangLine(infostr,width, false);
		 		if (tmpint == 0){
		 			dealedText.addElement(infostr);
		 			break;
		 		}
		 		else{
		 			if (infostr.charAt(tmpint - 1) == '\n')
		 				tmpStr = infostr.substring(0, tmpint - 1);
		 			else
		 				tmpStr = infostr.substring(0, tmpint);
		 				dealedText.addElement(tmpStr);
		 				infostr = infostr.substring(tmpint, infostr.length());
		 			}
		  	}	 		
	 	}catch(Exception e){		
	 		e.printStackTrace();	 	
	 	}
	 	return dealedText;
	}
	
	/**
	 * doLine的辅助方法
	 * @param str
	 * @param linewd
	 * @param fullword
	 * @return
	 */
	private static int ChangLine(String str,int linewd, boolean fullword){  
	     int len = 0, wd = 0;
	     for (int i = 0; i < str.length(); i++){ 
	     	if (str.charAt(i) == '\n'){
	     		if (i == 0)
	     			return len + 1;
	    	    else
	    	    	return len + 2;
	     	}
	     	wd += font.charWidth(str.charAt(i));
	       	if (wd > linewd){
	       		if (fullword){
	       			for (int j = len; j >= 0; j--){
	       				if (str.charAt(j) < 0x30 || str.charAt(j) >= 128){
	       					len = j;
	       					break;
	       				}
	       			}
	       		}
	         return len + 1;
	       	}
	       len = i;
	   	}
	   return 0;
	}
	
	/**
	 * 从原字符串中取出规定长度的字符串
	 * @param s
	 * @param w
	 * @return
	 */
    public static String CutString(String s, int w) {
        int tmpLength = s.length();
        do {
            if (font.stringWidth(s) <= w) {
                break;
            }
            if (--tmpLength == 0) {
                s = "";
                break;
            }
            s = s.substring(0, tmpLength);
        } while (true);
        return s;
    }
	
    /**
     * 从原字符串中找到指定的字符串,替换成另外的字符串
     * @param s
     * @param s1
     * @param s2
     * @param ignoreCase 是否忽略大小写
     * @return
     */
    public static String RepStringX(String s, String s1, String s2, boolean ignoreCase) {
        String tmp = "";
        if (s == null || s1 == null || s2 == null) {
            return s;
        }
        int j;
        if (ignoreCase) {
            s1 = s1.toLowerCase();
            int i;
            while ((i = s.toLowerCase().indexOf(s1)) != -1) {
                String s3 = s.substring(0, i);
                String s5 = s.substring(i + s1.length());
                tmp = tmp + s3 + s2;
                s = s5;
            }
        } else {
            while ((j = s.indexOf(s1)) != -1) {
                String s4 = s.substring(0, j);
                String s6 = s.substring(j + s1.length());
                tmp = tmp + s4 + s2;
                s = s6;
            }
        }
        return tmp + s;
    }

    /**
     * 从原字符串中找到指定的字符串,替换成另外的字符串,不忽略大小写
     * @param s
     * @param s1
     * @param s2
     * @return
     */
    public static String RepString(String s, String s1, String s2) {
        return RepStringX(s, s1, s2, false);
    }

    /**
     * 根据颜色名字返回16进制表示的颜色代码
     * @param s
     * @return
     */
    public static int GetColor(String s) {
        try {
            if (s == null) {
                return 0xffffff;
            }
            s = s.toLowerCase();
            if (s.equals("black")) {
                return 0;
            }
            if (s.equals("blue")) {
                return 4095;
            }
            if (s.equals("cyan")) {
                return 65535;
            }
            if (s.equals("gray")) {
                return 0x808080;
            }
            if (s.equals("green")) {
                return 65280;
            }
            if (s.equals("magenta")) {
                return 0xff00ff;
            }
            if (s.equals("red")) {
                return 0xff0000;
            }
            if (s.equals("white")) {
                return 0xffffff;
            }
            if (s.equals("yellow")) {
                return 0xffff00;
            }
            if (s.startsWith("#") && s.length() > 1) {
                s = s.substring(1);
            }
            if (s.startsWith("0x") && s.length() > 2) {
                s = s.substring(2);
            }
            return Integer.parseInt(s, 16);
        } catch (Exception exception) {
            return 0xffffff;
        }
    }
    
    /**
     * 返回URL中的主机地址
     * @param s
     * @return
     */
    public static String GetURLBase(String s) {
        String s1 = s;
        if (s1 == null) {
            return "";
        }
        if (!s1.startsWith("http://")) {
            s1 = "http://" + s1;
        }
        int i = s1.length();
        int j;
        for (j = i - 1; j >= 0 && s1.charAt(j) != '/' && s1.charAt(j) != '\\'; j--) {
        }
        s1 = s1.substring(0, j + 1);
        if (s1.equals("http://")) {
            s1 = s + "/";
        }
        return s1;
    }

    /**
     * 返回当前URL的根
     * @param s
     * @return
     */
    public static String GetURLRoot(String s) {
        if (s == null) {
            return "";
        }
        if (s.startsWith("http://")) {
            s = s.substring(7);
        }
        int i = s.length();
        if (i == 0) {
            return "";
        }
        int j;
        for (j = 0; j < i && s.charAt(j) != '/' && s.charAt(j) != '\\'; j++) {
        }
        if (j < i) {
            s = s.substring(0, j + 1);
        } else {
            s = s + "/";
        }
        return "http://" + s;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -