如果构造函数从得到的几个参数中不能获得一个有合法层次关系的URI—例如,假如给定了参数scheme,它要求这个URI是一个绝对的URI可是path参数却又不是一“/”开始的—它就会抛出异常URISyntaxException
Public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException
这个构造函数和前边所讲的那个基本相同,除了它增加了一个进行查询的string 参数。例如:
URI today= new URI("http", "www.ibiblio.org", "/javafaq/index.html",
"referrer=cnet&date=2004-08-23", "today");
与通常一样,遇到任何的语法错误它都会抛出异常URISyntaxException ,如果其中的哪个参数被省略,就用null代替。
public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException
这是构造一个有层次关系的URI的父亲构造函数,也就是说,前面提到的两个构造函数都会调用它。它把认证信息(authority)分成了user info, host, 和 port几部分。它们中的每一个都具备其自身的语法规则。比如:
URI styles = new URI("ftp", "anonymous:elharo@metalab.unc.edu",
"ftp.oreilly.com", 21, "/pub/stylesheet", null, null);
尽管这样,但是最后得到的URI仍然得遵从URI的一般规则。同样地,如果任何一个参数被省略,就用null代替。
public static URI create(String uri)
它不是个构造函数,而是个静态factory方法。不象构造函数那样,它不会抛出异常URISyntaxException 。如果你确信你的URI一定会是合法的,会遵从任一条规则,那么你就可以用该方法。比如,这次调用创建了一个用来匿名登陆一个FTP的URI ,它用一个邮箱地址当密码:
URI styles = URI.create(
"ftp://anonymous:elharo%40metalab.unc.edu@ftp.oreilly.com:
21/pub/stylesheet");
如果该URI确实存在问题,这个方法会抛出异常IllegalArgumentException 。它是在运行时才抛出的异常,所以你不能声明或捕获它。
The Parts of the URI
一个URI最多就三部分:scheme, scheme-specific , fragment identifier。一般形式:
scheme:scheme-specific-part:fragment
如果省略了scheme,这个URI就是相对的。如果fragment identifier被省略了,这个URI就很简单了。类URI有返回方法,它们能返回每个URI对象的这三部分。方法getRawFoo( ) 返回编码后的URI,与此类似的还有方法getFoo() ,它先解码%xx形式的字符,然后返回解码后的URI。
public String getScheme( )
public String getSchemeSpecificPart( )
public String getRawSchemeSpecificPart( )
public String getFragment( )
public String getRawFragment( )
注意: 这里没有方法getRawScheme( ) ,因为在URI规范中所有的协议名应专门由合法的ASCII字符组成。不允许%xx在协议名中出现。
如果URI 对象不具备相关的内容,这些方法都返回null:例如,对一个没指定协议的相对URI,或一个没有fragment identifier的http 协议的URI。一个指定了协议(scheme)的URI是一个绝对的URI。没有指定协议的URI是相对的URI。方法isAbsolute() 返回true如果这个URI是绝对的,如果是相对的就返回false:
public boolean isAbsolute( )
scheme-specific在细节上的变化取决于scheme的类型。比如在一个tel URL中,scheme-specific需要用类似电话号码的语法。尽管如此,但是在许多有用的URI中,包括很常见的file 和 http URL里面,scheme-specific都有其独特的描述层次关系的模式,包括authority, path, query string。Authority又被细分为user info, host, port。方法isOpaque() 返回false如果这是个有层次关系的URI,否则返回true—也就是说,如果是层次模糊的:
public boolean isOpaque( )
如果URI是层次模糊的,所有你能得到的就只是scheme, scheme-specific , fragment identifier。尽管如此,但是如果URI是有层次关系的,下面的getter方法还是能获取该URI的所有内容:
public String getAuthority( )
public String getFragment( )
public String getHost( )
public String getPath( )
public String getPort( )
public String getQuery( )
public String getUserInfo( )
所有这些方法返回的都是解码后的内容;换句话说,这种形式%xx,例如%3c,都会被转换成它本身所表示的字符,比如符号“<”。如果你想得到未经解码的URI,这里有5个相并列的方法:
public String getRawAuthority( )
public String getRawFragment( )
public String getRawPath( )
public String getRawQuery( )
public String getRawUserInfo( )