url.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 814 行 · 第 1/2 页
JAVA
814 行
* If the protocol parsed out of the URL is different
* from the context URL's protocol, then then URL String is also
* expected to be a complete URL.
* <p>
* Additionally, this method allows the caller to specify a protocol handler
* to use instead of the default. If this handler is specified, the caller
* must have the "specifyStreamHandler" permission
* (see <code>NetPermission</code>) or a <code>SecurityException</code>
* will be thrown.
*
* @param context The context in which to parse the specification
* @param spec The string to parse as an URL
* @param handler The stream handler for the URL
*
* @exception MalformedURLException If a protocol handler cannot be found
* or the URL cannot be parsed
* @exception SecurityException If the <code>SecurityManager</code> exists
* and does not allow the caller to specify its own protocol handler.
*
* @since 1.2
*/
public URL(URL context, String spec, URLStreamHandler handler)
throws MalformedURLException {
/* A protocol is defined by the doc as the substring before a ':'
* as long as the ':' occurs before any '/'.
*
* If context is null, then spec must be an absolute URL.
*
* The relative URL need not specify all the components of a URL.
* If the protocol, host name, or port number is missing, the value
* is inherited from the context. A bare file component is appended
* to the context's file. The optional anchor is not inherited.
*/
// If this is an absolute URL, then ignore context completely.
// An absolute URL must have chars prior to "://" but cannot have a colon
// right after the "://". The second colon is for an optional port value
// and implies that the host from the context is used if available.
int colon;
if ((colon = spec.indexOf("://", 1)) > 0
&& !spec.regionMatches(colon, "://:", 0, 4))
context = null;
int slash;
if ((colon = spec.indexOf(':')) > 0
&& (colon < (slash = spec.indexOf('/')) || slash < 0)) {
// Protocol specified in spec string.
protocol = spec.substring(0, colon).toLowerCase();
if (context != null && context.protocol.equals(protocol)) {
// The 1.2 doc specifically says these are copied to the new URL.
host = context.host;
port = context.port;
file = context.file;
authority = context.authority;
}
} else if (context != null) {
// Protocol NOT specified in spec string.
// Use context fields (except ref) as a foundation for relative URLs.
colon = -1;
protocol = context.protocol;
host = context.host;
port = context.port;
file = context.file;
authority = context.authority;
} else // Protocol NOT specified in spec. and no context available.
throw new MalformedURLException("Absolute URL required with null context");
if (handler != null) {
SecurityManager s = System.getSecurityManager();
if (s != null)
s.checkPermission(new NetPermission("specifyStreamHandler"));
this.handler = handler;
} else
this.handler = getURLStreamHandler(protocol);
if (this.handler == null)
throw new MalformedURLException(
"Protocol handler not found: " + protocol);
// JDK 1.2 doc for parseURL specifically states that any '#' ref
// is to be excluded by passing the 'limit' as the indexOf the '#'
// if one exists, otherwise pass the end of the string.
int hashAt = spec.indexOf('#', colon + 1);
this.handler.parseURL(
this,
spec,
colon + 1,
hashAt < 0 ? spec.length() : hashAt);
if (hashAt >= 0)
ref = spec.substring(hashAt + 1);
hashCode = hashCode(); // Used for serialization.
}
/**
* Test another URL for equality with this one. This will be true only if
* the argument is non-null and all of the fields in the URL's match
* exactly (ie, protocol, host, port, file, and ref). Overrides
* Object.equals(), implemented by calling the equals method of the handler.
*
* @param obj The URL to compare with
*
* @return true if the URL is equal, false otherwise
*/
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof URL))
return false;
URL uObj = (URL)obj;
return handler.equals(this, uObj);
}
/**
* Returns the contents of this URL as an object by first opening a
* connection, then calling the getContent() method against the connection
*
* @return A content object for this URL
* @exception IOException If opening the connection or getting the
* content fails.
*
* @since 1.3
*/
public final Object getContent() throws IOException {
return openConnection().getContent();
}
/**
* Gets the contents of this URL
*
* @exception IOException If an error occurs
*/
public final Object getContent(Class[] classes) throws IOException {
// FIXME: implement this
return getContent();
}
/**
* Returns the file portion of the URL.
* Defined as <code>path[?query]</code>.
* Returns the empty string if there is no file portion.
*/
public String getFile() {
return file == null ? "" : file;
}
/**
* Returns the path of the URL. This is the part of the file before any '?'
* character.
*
* @since 1.3
*/
public String getPath() {
int quest = (file == null) ? -1 : file.indexOf('?');
return quest < 0 ? getFile() : file.substring(0, quest);
}
/**
* Returns the authority of the URL
*
* @since 1.3
*/
public String getAuthority() {
return authority;
}
/**
* Returns the host of the URL
*/
public String getHost() {
int at = (host == null) ? -1 : host.indexOf('@');
return at < 0 ? host : host.substring(at + 1, host.length());
}
/**
* Returns the port number of this URL or -1 if the default port number is
* being used.
*
* @return The port number
*
* @see #getDefaultPort()
*/
public int getPort() {
return port;
}
/**
* Returns the default port of the URL. If the StreamHandler for the URL
* protocol does not define a default port it returns -1.
*/
public int getDefaultPort() {
return handler.getDefaultPort();
}
/**
* Returns the protocol of the URL
*/
public String getProtocol() {
return protocol;
}
/**
* Returns the ref (sometimes called the "# reference" or "anchor") portion
* of the URL.
*
* @return The ref
*/
public String getRef() {
return ref;
}
/**
* Returns the user information of the URL. This is the part of the host
* name before the '@'.
*
* @return the user at a particular host or null when no user defined.
*/
public String getUserInfo() {
int at = (host == null) ? -1 : host.indexOf('@');
return at < 0 ? null : host.substring(0, at);
}
/**
* Returns the query of the URL. This is the part of the file before the
* '?'.
*
* @ return the query part of the file, or null when there is no query part.
*/
public String getQuery() {
int quest = (file == null) ? -1 : file.indexOf('?');
return quest < 0 ? null : file.substring(quest + 1, file.length());
}
/**
* Returns a hashcode computed by the URLStreamHandler of this URL
*/
public int hashCode() {
if (hashCode != 0)
return hashCode; // Use cached value if available.
else
return handler.hashCode(this);
}
/**
* Returns a URLConnection object that represents a connection to the remote
* object referred to by the URL. The URLConnection is created by calling the
* openConnection() method of the protocol handler
*
* @return A URLConnection for this URL
* @exception IOException If an error occurs
*/
public URLConnection openConnection() throws IOException {
return handler.openConnection(this);
}
/**
* Opens a connection to this URL and returns an InputStream for reading
* from that connection
*
* @exception IOException If an error occurs
*/
public final InputStream openStream() throws IOException {
return openConnection().getInputStream();
}
/**
* Tests whether or not another URL refers to the same "file" as this one.
* This will be true if and only if the passed object is not null, is a
* URL, and matches all fields but the ref (ie, protocol, host, port,
* and file);
*
* @param other The URL object to test with
*
* @return true if URL matches this URL's file, false otherwise
*/
public boolean sameFile(URL other) {
return handler.sameFile(this, other);
}
/**
* Sets the specified fields of the URL. This is not a public method so
* that only URLStreamHandlers can modify URL fields. This might be called
* by the <code>parseURL()</code> method in that class. URLs are otherwise
* constant.
*
* @param protocol The protocol name for this URL
* @param host The hostname or IP address for this URL
* @param port The port number of this URL
* @param file The "file" portion of this URL.
* @param ref The anchor portion of this URL.
*/
protected void set(
String protocol,
String host,
int port,
String file,
String ref) {
// TBD: Theoretically, a poorly written StreamHandler could pass an
// invalid protocol. It will cause the handler to be set to null
// thus overriding a valid handler. Callers of this method should
// be aware of this.
this.handler = getURLStreamHandler(protocol);
this.protocol = protocol.toLowerCase();
this.authority = null;
this.port = port;
this.host = host;
this.file = file;
this.ref = ref;
hashCode = hashCode(); // Used for serialization.
}
/**
* Sets the specified fields of the URL. This is not a public method so
* that only URLStreamHandlers can modify URL fields. URLs are otherwise
* constant.
*
* @since 1.3
*/
protected void set(
String protocol,
String host,
int port,
String authority,
String userInfo,
String path,
String query,
String ref) {
// TBD: Theoretically, a poorly written StreamHandler could pass an
// invalid protocol. It will cause the handler to be set to null
// thus overriding a valid handler. Callers of this method should
// be aware of this.
this.handler = getURLStreamHandler(protocol);
this.protocol = protocol.toLowerCase();
if (userInfo == null)
this.host = host;
else
this.host = userInfo + "@" + host;
this.port = port;
if (query == null)
this.file = path;
else
this.file = path + "?" + query;
this.ref = ref;
hashCode = hashCode(); // Used for serialization.
}
/**
* Sets the URLStreamHandlerFactory for this class. This factory is
* responsible for returning the appropriate protocol handler for
* a given URL.
*
* @param fac The URLStreamHandlerFactory class to use
*
* @exception Error If the factory is alread set.
* @exception SecurityException If a security manager exists and its
* checkSetFactory method doesn't allow the operation
*/
public static synchronized void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) {
if (factory != null)
throw new Error("URLStreamHandlerFactory already set");
// Throw an exception if an extant security mgr precludes
// setting the factory.
SecurityManager s = System.getSecurityManager();
if (s != null)
s.checkSetFactory();
factory = fac;
}
/**
* Returns a String representing this URL. The String returned is
* created by calling the protocol handler's toExternalForm() method.
*
* @return A string for this URL
*/
public String toExternalForm() {
// Identical to toString().
return handler.toExternalForm(this);
}
/**
* Returns a String representing this URL. Identical to toExternalForm().
* The value returned is created by the protocol handler's
* toExternalForm method. Overrides Object.toString()
*
* @return A string for this URL
*/
public String toString() {
// Identical to toExternalForm().
return handler.toExternalForm(this);
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject();
this.handler = getURLStreamHandler(protocol);
if (this.handler == null)
throw new IOException(
"Handler for protocol " + protocol + " not found");
}
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?