大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: URL 类

URL 类可以提供URL(Uniform Resource Locator)的Protocol、Host、Port、File、named anchor与URLStreamHandler等信息,它拥有几个构造函数,它们皆需处理MalformedURLException:
public URL(String url)
public URL(String protocol, String host, String file)
public URL(String protocol, String host, int port, String file)
public URL(URL u,String s)

URL类可以由以下几个方法取得信息:
public String getProtocol()
public String getHost()
public int getPort()
public String getFile()
public String getRef()


其中getFile()会包括从主机名称后至文件名称的字符串,包括/,而getRef()则是取回引用点名称,中文俗称网页中的“书签”,下面这个程序示范这几个方法的作用:
  • UrlInfo.java
package onlyfun.caterpillar;

import java.net.*;

public class UrlInfo {
public static void main(String[] args) {
try {
URL url = new URL(args[0]);
System.out.printf("URL: %s%n", url);
System.out.printf("Protocal: %s%n", url.getProtocol());
System.out.printf("Host: %s%n", url.getHost());
System.out.printf("Port: %d%n", url.getPort());
System.out.printf("File: %s%n", url.getFile());
System.out.printf("REF: %s%n", url.getRef());
}
catch(MalformedURLException e) {
e.printStackTrace();
}
}
}

当执行程序时给定的参数为http://caterpillar.onlyfun.net:8080/admin/setup.html#justin,执行结果如下:
URL: http://caterpillar.onlyfun.net:8080/admin/setup.html#justin
Protocal: http
Host: caterpillar.onlyfun.net
Port: 8080
File: /admin/setup.html
REF: justin

URL类有三个方法可以取得指定的URL数据,这三个方法必须处理IOException:
public final InputStream openStream()
public URLConnection openConnection()
public final Object getContent()


在这边先示范openStream(),它会自动处理连线之间的协定动作,并传回一个InputStream对象,所以可以将它塞入BufferedReader或BufferedInputStream等I/O类,再透过它来读取服务器传来的数据。

下面这个程序即利用openStream()取得指定网址的数据,并自动将数据储存在对应文件名称之中,由于是使用BufferedInputStream,您可以用它来储存HTML网页,也可以储存图片:
  • UrlInfo.java
package onlyfun.caterpillar;

import java.io.*;
import java.net.*;

public class Download {
public static void main(String[] args) {
try {
URL url = new URL(args[0]);
String fileName = url.getFile().substring(
url.getFile().lastIndexOf('/') + 1);

BufferedInputStream inputStream =
new BufferedInputStream(url.openStream());
BufferedOutputStream outputStream =
new BufferedOutputStream(
new FileOutputStream(fileName));

int read = 0;
while((read = inputStream.read()) != -1) {
outputStream.write(read);
}

inputStream.close();
outputStream.flush();
outputStream.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}