1、package d150814_0_3;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import j
2、ava.io.OutputStream;import java.io.OutputStreamWriter;import java.security.MessageDigest;import java.text.DecimalFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Enumeration;import java.util.Properties;import java.util.jar.JarEntry;import java.util.jar.JarFil
3、e;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;/* 常用函数集*/public class Util/* 默认类型*/public final static String CONTENT_TYPE = “text/html; charset=GBK“;/* 界面风格常数 网格检索*/public final static int M_VIEW=1;/* 界面风格常数 单记录编辑*/public final static int M_EDIT=2;/* 界面风格常数 网格+ 记录编辑*/public final stat
4、ic int M_INP=3;/* 界面风格常数 网格+ 记录查询*/public final static int M_QRY=4;/* 界面风格常数 网格+ 嵌入记录编辑*/public final static int M_LINEINP=5;/* 界面风格常数 网格+ 嵌入记录查询*/public final static int M_LINEQRY=6;/* 界面风格常数 网格+ 窗口记录编辑*/public final static int M_WININP=7;/* 界面风格常数 网格+ 窗口记录查询*/public final static int M_WINQRY=8;/*
5、界面工作选项 不显示菜单*/public final static int PM_NOMENU=1;/* 界面工作选项 不分页*/public final static int PM_NOPAGE=2;/* 界面工作选项 模式窗体*/public final static int PM_MODAL=4;/* 默认表格背景色*/public static String GRIDBGCOLOR=“#F2F2F2“;/A9B6CD/* 默认编辑背景色*/public static String EDITBGCOLOR=“#F2F2F2“;/A9B6CD/* 默认表格选择记录色*/public sta
6、tic String HICOLOR=“#C8D1C6“; /“#ffff99“; /“#d0d0d0“;/* 默认表格选中记录色*/public static String CHOOSECOLOR=“#ccffcc“; /“#ff99ff“;/* 默认表头背景色*/public static String HEADBGCOLOR=“#c0c0c0“;/* 默认表头字体颜色*/public static String HEADFONTCOLOR=“#0000FF“;/* 默认条件背景色*/public static String CONDBGCOLOR=“#d0d0d0“;/* 默认条件标题字
7、体颜色*/public static String CONDTITLEFONTCOLOR=“#0000ff“;/* 默认条件标题背景色*/public static String CONDTITLEBGCOLOR=“#d0d0d0“;/* 返回临时目录*/public static File tempDir()String temp=System.getProperty(“Temp“,null);if (temp=null | temp.length()=0) temp=“Temp“;File f=new File(temp);if (!f.exists() f.mkdir();return
8、f;/错误处理和记录static StringBuffer errs=new StringBuffer();static int ErrNum=0;/* 错误提示 ,建议都用此函数输出调试信息*/public static void Err(String err)ErrNum+;if (ErrNum100) errs.delete(0,errs.indexOf(“n“)+1);errs.append(err+“n“);System.err.println(err);/* 返回最后 100 行的错误信息*/public static String Err()return errs.toStrin
9、g();/* 字符串截取函数 .* * 返回以 semi 分隔开的第 n 段字符串.n 从 1 开始*/public static String middle(String s,String semi,int n)if (s=null) return null;int nn=0; /表示当前层次boolean found=true;int i=0;if (n0) nn-;elseif (nn=0 if (n=0) /找到数据,获得数据就可以了int j=i+len;int j0=j;while (j0) nn-;elseif (nn=0)if (j+semi.length()0) nn-;el
10、seif (nn=0 if (n=0) /找到数据,获得数据就可以了int j=i+len;if (j=s.length() return “;elsereturn s.substring(j);elseif (len=0) i-; else i+=semi.length()-1;i+;if (i+semi.length()=0) s=middle(s,“,1)+“-“+tail(s,“ “,2);while (s.indexOf(“.“)=0) s=middle(s,“.“,1)+“-“+tail(s,“.“,2);return stod(s,“yyyy-MM-dd“);/* 字符串按格式转
11、为日期.* * 如果空,则返回 null; * 如果转换错误 , 首先尝试按“日期时间格式“处理,如果仍然错误,返回 null*/public static java.util.Date stod(String s,String format)if (s.equals(“ “) s=“;if (s.equals(“) return null;trySimpleDateFormat fmt=new SimpleDateFormat(format);return fmt.parse(s);catch (ParseException e)if (format.equals(“yyyy-MM-dd H
12、H:mm:ss“)trySimpleDateFormat fmt=new SimpleDateFormat(“yyyy-MM-dd HH:mm“);return fmt.parse(s);catch(ParseException ee)trySimpleDateFormat fmt=new SimpleDateFormat(“yyyy-MM-dd“);return fmt.parse(s);catch(ParseException eee)Err(“Util.stod ERR:“+eee+“ fmt=“+format);elseErr(“Util.stod ERR:“+e+“ fmt=“+fo
13、rmat);return null;/* 整数简化函数 .* 超过 1000,按 K 处理, 超过 1000000 按 M 处理 否则为 B*/public static String shortInt(long nn)double f=nn;DecimalFormat fmt=new DecimalFormat(“0.0“);if (f=enc.length() x=0;if (i0) sb.append(|);sb.append(Long.toHexString(z);return sb.toString();/* 简单的字符穿解码*/public static String decode
14、(String ss,String enc)if (ss=null) return null;StringBuffer sb=new StringBuffer(“);int x=0;for (int i=1;i+)tryString s=middle(ss,“|“,i);if (s.length()=0) break;int z=Long.decode(“#“+s).intValue()enc.charAt(x);x+;if (x=enc.length() x=0;sb.append(char)z);catch (Exception e)return sb.toString();/BASE64
15、 的字符串编码和解码private static byte basis_64 =A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9,.,$,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?;priv
16、ate static byte index_64 =-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,-1, 0, 1, 2, 3, 4, 5,
17、6, 7, 8, 9, 10, 11, 12, 13, 14,15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1;private static byte CHAR64(byte c)if (c 127) return -1;return index_64c;/* 64 位编
18、码.* * 返回实际长度, 0=fail -1=BufOverflow*/static int encode64(byte in, int inlen, byte out, int outmax)int olen = (inlen + 2) / 3 * 4;if (outmax = 3)byte n=(byte)(char)inj2)outi=basis_64n;i+;n=(byte)(char)inj 4)outi=basis_64n;i+;n=(byte)(char)inj+1 6)outi=basis_64n;i+;n=(byte)(char)inj+2 outi=basis_64n;i
19、+;inlen -= 3;j+=3;if (inlen 0)byte n=(byte)(char)inj2)outi = basis_64n;byte oval =(byte)(char)inj 1)oval |= (char)inj+1 4)i+;outi=basis_64oval;i+;outi=(inlen 4);j+;len+;if (c3 != !)outj=(byte)(char)CHAR64(c2) 2);j+;+len;if (c4 != !)outj=(byte)(char)CHAR64(c3) 0)String s = getBytes(z, 0, sz);buf.appe
20、nd(s);x=null;z=null;/* 对数据流的 64 位编码*/public static void encodeStream(InputStream is,OutputStream os) throws IOException/Util.Err(“encoding “+ss);if (is=null) return;byte x=new byte3072;byte z=new bytex.length+x.length+4;while (true)int size = is.read(x);if (size=-1) break;int sz = encode64(x, size,
21、z, z.length);if (sz 0)os.write(z,0,sz);x=null;z=null;/* 对数据流的 64 位解码*/public static void decodeStream(InputStream is,OutputStream os) throws IOExceptionif (is=null) return;byte x=new byte4096;byte z=new byte4096;while(true)int nn=0;while (nn0)if (key.startsWith(but) continue;if (key.length()=0) cont
22、inue;m.write(key+“=“+val+“rn“);m.close();catch (Exception e) Util.Err(“saveProperties ERR:“+e);/* 对 zip 文件的读函数.* * entry 为目录和文件名*/public static InputStream loadZipStream(String fn,String entry)File f=new File(fn);if (!f.exists() return null;tryZipFile z = new ZipFile(f);ZipEntry en = z.getEntry(entr
23、y);if (en = null)return null;return z.getInputStream(en);catch(Exception e)return null;/* 对 jar 文件的读函数.* * entry 为目录和文件名*/public static InputStream loadJarStream(String fn,String entry)File f=new File(fn);if (!f.exists() return null;tryJarFile z = new JarFile(f);JarEntry en = z.getJarEntry(entry);if
24、 (en = null)return null;return z.getInputStream(en);catch(Exception e)return null;/* 转换为 Java 格式字符串 .* * m: 1=单引号处理 2=双引号处理 3=都处理*/public static String stos(String s,int m)StringBuffer b=new StringBuffer(s);int i=0;while (i) b.setCharAt(i,;); b.insert(i,“i+=4; elseif (b.charAt(i)= )if (i+1); b.inser
25、t(i,“=0) rule=middle(rule,“%“,1)+tail(rule,“%“,2);if (rule.indexOf(“)=0)if (v=stof(middle(rule,“,2) return true;elseif (rule.indexOf(“=“)=0)if (v=stof(middle(rule,“=“,2) return true;elseif (rule.indexOf(“)=0)if (v=0)if (v=0)if (v=stof(middle(rule,“,1) return true;elseif (rule.indexOf(“)=0)if (v=stof
26、(middle(rule,“,1) return true;elseif (rule.indexOf(“)=0)double a=stof(middle(rule,“,1);double b=stof(middle(rule,“,2);if (v=a-b) return true;elseif (rule.indexOf(“=0)if (v“)=0)if (vstof(middle(rule,“,2) return true;elseif (rule.indexOf(“-“)=0)if (v=stof(middle(rule,“-“,1) return true;elseif (rule.in
27、dexOf(“=“)=0)if (v=stof(middle(rule,“=“,2) return true;elseif (rule.indexOf(“=0)if (v!=stof(middle(rule,“=0)if (v!=stof(middle(rule,“,2) return true;else return true;return false;/* 根据格式要求转换结果为对应格式*/public static String getFmtValue(String value,String fmt)if (fmt=null | fmt.length()=0) return value;
28、if (fmt.indexOf(“yy“)=0 | fmt.indexOf(“dd“)=0 | fmt.indexOf(“MM“)=0 | fmt.indexOf(“HH“)=0 | fmt.indexOf(“mm“)=0 |fmt.indexOf(“ss“)=0)value=dtos(stod(value),fmt);elsedouble f=stof(value);value=formatFloat(f,fmt);return value;/* 读内容*/public static String getItem(Properties hash,String item)String ss=(
29、String)hash.get(item);if (ss=null) ss=“;return ss;/* 字段类型 Clob 判断*/public static boolean isClob(int type)return (type=java.sql.Types.CLOB | type=java.sql.Types.LONGVARCHAR);/* 字段类型 Blob 判断*/public static boolean isBlob(int type)return (type=java.sql.Types.BLOB | type=java.sql.Types.LONGVARBINARY | t
30、ype=java.sql.Types.VARBINARY | type=java.sql.Types.BINARY);/* 字段类型数值判断*/public static boolean isNumeric(int type)return (type=java.sql.Types.DOUBLE | type=java.sql.Types.FLOAT | type=java.sql.Types.INTEGER | type=java.sql.Types.NUMERIC | type=java.sql.Types.DECIMAL | type=java.sql.Types.REAL | type=
31、java.sql.Types.SMALLINT | type=java.sql.Types.TINYINT | type=java.sql.Types.BIGINT);static long t0=System.currentTimeMillis();/* 提示信息 .* * param hint 空则重新计时. 否则显示消耗时间,同时重新计时*/public static void debug(String hint)long t1=System.currentTimeMillis();if (hint.length()0)Util.Err(“till “+hint+“ cost=“+(t1
32、-t0)+“ms“);t0=t1;/* 子字符串替换*/public static String replace(String str,String instr,String subs)int index=str.indexOf(instr);for (int i=0;i=0;i+)str=str.substring(0,index)+subs+str.substring(index+instr.length();index=str.indexOf(instr);return str;/* 提取文件名*/public static String extractFileName(String f
33、ileName)int lastDot = fileName.lastIndexOf( “);if( lastDot != -1)return fileName.substring(lastDot+1);lastDot = fileName.lastIndexOf( “/“);if( lastDot != -1)return fileName.substring( lastDot+1);return fileName.toLowerCase();/* 获得文件扩展名*/public static String extractFileExt(String fn)if (fn.indexOf(?)
34、=0) fn=Util.middle(fn,“?“,1);int n=fn.lastIndexOf(“.“);if (n=0)return fn.substring(n);elsereturn “;/* 变更文件扩展名*/public static String changeFileExt(String fn,String ext)if (fn.indexOf(?)=0) fn=Util.middle(fn,“?“,1);int n=fn.lastIndexOf(“.“);if (n=0)return fn.substring(0,n)+ext;elsereturn fn+ext;/* 获得文
35、件扩展名*/public static String extractFilePath(String fn)fn=fn.replace(,/);int i=fn.lastIndexOf(/);if (i0) return fn.substring(0,i);elsereturn fn;private static String extToMimeType = new String“.css“, “text/css“,“.htm“, “text/html“,“.html“, “text/html“,“.gif“, “image/gif“,“.jpg“, “image/jpeg“,“.jpeg“,
36、“image/jpeg“,“.js“, “application/x-javascript“,“.zip“, “application/zip“,“.exe“, “application/octet-stream“,“.txt“, “text/plain“,“.rm“, “application/vnd.rn-realmedia“,“.mp3“, “audio/x-mpeg“,“.tif“, “image/tiff“,“.tiff“, “image/tiff“,“.doc“, “application/msword“,“.swf“, “application/x-shockwave-flash
37、“,“.xsl“, “application/msexcel“,“.ppt“, “application/mspowerpoint“;/* 获得文件对应的媒体类型*/public static String getContentTypeFor(String fileName)String type = “application/octet-stream“;int lastDot = fileName.lastIndexOf( .);if( lastDot != -1)String ext = fileName.substring( lastDot).toLowerCase();for (int
38、 i=0;i“+/ “+/ “+/ “+/ “ “+/ “+/ “);buf.append(“n“);buf.append(“ n“);buf.append(“n“); /fill opacity= method=“+method+“ focus=100% buf.append(“n“);return buf;/* 下拉 HTML 元素*/public static String getCombo(String name,int size,String def,String list,String ext,String both)/Util.Err(name+“=“+list);StringB
39、uffer st=new StringBuffer(“);boolean selected=false;String value=“;for (int i=1;i+)String t=Util.middle(list,“;“,i);if (t.equals(“) break;String s=Util.middle(t,“=“,1);String ss=Util.middle(t,“=“,2);if (ss.length()=0) ss=s;elseif (both.equals(“1“) ss=s+“ - “+ss;st.append(“+ss+“);st.append(“);if (ext.equalsIgnoreCase(“readonly“)return value;return st.toString();