📄 uriutil.java
字号:
* @param p2 URI path segment (should be encoded) * @return Legally combined path segments. */ public static String addPaths(String p1, String p2) { if (p1==null || p1.length()==0) { if (p1!=null && p2==null) return p1; return p2; } if (p2==null || p2.length()==0) return p1; int split=p1.indexOf(';'); if (split<0) split=p1.indexOf('?'); if (split==0) return p2+p1; if (split<0) split=p1.length(); StringBuffer buf = new StringBuffer(p1.length()+p2.length()+2); buf.append(p1); if (buf.charAt(split-1)=='/') { if (p2.startsWith(URIUtil.SLASH)) { buf.deleteCharAt(split-1); buf.insert(split-1,p2); } else buf.insert(split,p2); } else { if (p2.startsWith(URIUtil.SLASH)) buf.insert(split,p2); else { buf.insert(split,'/'); buf.insert(split+1,p2); } } return buf.toString(); } /* ------------------------------------------------------------ */ /** Return the parent Path. * Treat a URI like a directory path and return the parent directory. */ public static String parentPath(String p) { if (p==null || URIUtil.SLASH.equals(p)) return null; int slash=p.lastIndexOf('/',p.length()-2); if (slash>=0) return p.substring(0,slash+1); return null; } /* ------------------------------------------------------------ */ /** Strip parameters from a path. * Return path upto any semicolon parameters. */ public static String stripPath(String path) { if (path==null) return null; int semi=path.indexOf(';'); if (semi<0) return path; return path.substring(0,semi); } /* ------------------------------------------------------------ */ /** Convert a path to a cananonical form. * All instances of "." and ".." are factored out. Null is returned * if the path tries to .. above its root. * @param path * @return path or null. */ public static String canonicalPath(String path) { if (path==null || path.length()==0) return path; int end=path.length(); int queryIdx=path.indexOf('?'); int start = path.lastIndexOf('/', (queryIdx > 0 ? queryIdx : end)); // int start = path.lastIndexOf('/', end); search: while (end>0) { switch(end-start) { case 2: // possible single dot if (path.charAt(start+1)!='.') break; break search; case 3: // possible double dot if (path.charAt(start+1)!='.' || path.charAt(start+2)!='.') break; break search; } end=start; start=path.lastIndexOf('/',end-1); } // If we have checked the entire string if (start>=end) return path; StringBuffer buf = new StringBuffer(path); int delStart=-1; int delEnd=-1; int skip=0; while (end>0) { switch(end-start) { case 2: // possible single dot if (buf.charAt(start+1)!='.') { if (skip>0 && --skip==0) { delStart=start>=0?start:0; if(delStart>0 && delEnd==buf.length() && buf.charAt(delEnd-1)=='.') delStart++; } break; } if(start<0 && buf.length()>2 && buf.charAt(1)=='/' && buf.charAt(2)=='/') break; if(delEnd<0) delEnd=end; delStart=start; if (delStart<0 || delStart==0&&buf.charAt(delStart)=='/') { delStart++; if (delEnd<buf.length() && buf.charAt(delEnd)=='/') delEnd++; break; } if (end==buf.length()) delStart++; end=start--; while (start>=0 && buf.charAt(start)!='/') start--; continue; case 3: // possible double dot if (buf.charAt(start+1)!='.' || buf.charAt(start+2)!='.') { if (skip>0 && --skip==0) { delStart=start>=0?start:0; if(delStart>0 && delEnd==buf.length() && buf.charAt(delEnd-1)=='.') delStart++; } break; } delStart=start; if (delEnd<0) delEnd=end; skip++; end=start--; while (start>=0 && buf.charAt(start)!='/') start--; continue; default: if (skip>0 && --skip==0) { delStart=start>=0?start:0; if(delEnd==buf.length() && buf.charAt(delEnd-1)=='.') delStart++; } } // Do the delete if (skip<=0 && delStart>=0 && delStart>=0) { buf.delete(delStart,delEnd); delStart=delEnd=-1; if (skip>0) delEnd=end; } end=start--; while (start>=0 && buf.charAt(start)!='/') start--; } // Too many .. if (skip>0) return null; // Do the delete if (delEnd>=0) buf.delete(delStart,delEnd); return buf.toString(); } /* ------------------------------------------------------------ */ /** Convert a path to a compact form. * All instances of "//" and "///" etc. are factored out to single "/" * @param path * @return path */ public static String compactPath(String path) { if (path==null || path.length()==0) return path; int state=0; int end=path.length(); int i=0; loop: while (i<end) { char c=path.charAt(i); switch(c) { case '?': return path; case '/': state++; if (state==2) break loop; break; default: state=0; } i++; } if (state<2) return path; StringBuffer buf = new StringBuffer(path.length()); char[] chars = path.toCharArray(); buf.append(chars,0,i); loop2: while (i<end) { char c=path.charAt(i); switch(c) { case '?': buf.append(chars,i,end-i); break loop2; case '/': if (state++==0) buf.append(c); break; default: state=0; buf.append(c); } i++; } return buf.toString(); } /* ------------------------------------------------------------ */ /** * @param uri URI * @return True if the uri has a scheme */ public static boolean hasScheme(String uri) { for (int i=0;i<uri.length();i++) { char c=uri.charAt(i); if (c==':') return true; if (!(c>='a'&&c<='z' || c>='A'&&c<='Z' || (i>0 &&(c>='0'&&c<='9' || c=='.' || c=='+' || c=='-')) )) break; } return false; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -