记住类URI 与URI规范是不同的。所以像é 和 ü 这种非ASCII字符绝不会在第一位置以%xx形式出现,所以在用方法getRawFoo() 返回得到的string中,仍将回出现在其中;除非本来被用做构建URI对象的string已被编码。
注意: 这里没有方法getRawPort( ) 和 getRawHost( ) ,因为这些部分总是被保证由ASCII字符构成的,至少现在是这样的。国际化的域名时代即将来临,希望在java以后的版本中能重新思考这一做法。
事实上,具体的URI不会包括这些信息—例如,这个URI,http://www.example.com 就没有user info, path, port, 或 query string—相应的方法就返回null。方法getPort( ) 是唯一例外。因为它被声明为返回一个int ,所以它不能返回null。它就用返回-1来代替,来表示没有port的信息。
由于各种技术上的也不会有多大实际影响的原因,java不会一开始就在认证部分做语法错误检察。这样做的一个很自然的后果就是不会返回认证的各个部分:port, host, user info。这种情况下,你可以调用parseServerAuthority() 让认证(authority)被强制再解析:
public URI parseServerAuthority( ) throws URISyntaxException
这个最初的URI 不会发生变化(URI对象是永远不会变的),但是URI 的返回值将会是authority被分开后的部分:user info, host, port。如果这个authority不能被解析,会抛出URISyntaxException 异常。
例子7-10使用这些方法把输入在命令行上的URI分成了它的那几个组成部分。这与例子7-4相似,只是它处理的是语法上正确的URI,而不要求JDK必须提供一个合适的protocal 处理器。
Example 7-10. The parts of a URI
import java.net.*;
public class URISplitter {
public static void main(String args[]) {
for (int i = 0; i < args.length; i++) {
try {
URI u = new URI(args[i]);
System.out.println("The URI is " + u);
if (u.isOpaque( )) {
System.out.println("This is an opaque URI.");
System.out.println("The scheme is " + u.getScheme( ));
System.out.println("The scheme specific part is "
+ u.getSchemeSpecificPart( ));
System.out.println("The fragment ID is " + u.getFragment( ));
}
else {
System.out.println("This is a hierarchical URI.");
System.out.println("The scheme is " + u.getScheme( ));
try {
u = u.parseServerAuthority( );
System.out.println("The host is " + u.getUserInfo( ));
System.out.println("The user info is " + u.getUserInfo( ));
System.out.println("The port is " + u.getPort( ));
}
catch (URISyntaxException ex) {
// Must be a registry based authority
System.out.println("The authority is " + u.getAuthority( ));
}
System.out.println("The path is " + u.getPath( ));
System.out.println("The query string is " + u.getQuery( ));
System.out.println("The fragment ID is " + u.getFragment( ));
} // end else
} // end try
catch (URISyntaxException ex) {