Java获取URL对应的资源
 
认识IP、认识URL是进行网络编程的第一步。java.net.URL提供了丰富的URL构建方式,并可以通过java.net.URL来获取资源。
 
一、认识URL
 
URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
 
简单的可以把URL理解为包含:协议、主机名、端口、路径、查询字符串和参数等对象。每一段可以独立设置。
 
应用程序也可以指定一个“相对 URL”,它只包含到达相对于另一个 URL 的资源的足够信息。HTML 页面中经常使用相对 URL。
 
相对 URL 不需要指定 URL 的所有组成部分。如果缺少协议、主机名称或端口号,这些值将从完整指定的 URL 中继承。
 
由于 URL 不懂 URL 转义,所以它不会识别同一 URL 的对等编码和解码形式。
 
注意,URI 类在某些特定情况下对其组成字段执行转义。建议使用 URI 管理 URL 的编码和解码,并使用 toURI()URI.toURL() 实现这两个类之间的转换。
 
也可以使用 URLEncoderURLDecoder 类,但是只适用于 HTML 形式的编码,它与 RFC2396 中定义的编码机制不同。
(以上介绍来自Java API doc)
 
二、URL对象的构建
 
方式很多,可以看看API文档。
 
三、获取URL指定的资源
 
下面给个例子,说明如何获取到指定的资源。
import java.io.*;
import java.net.URL;
import java.net.URLConnection;

public class TestURL {
        public static void main(String[] args) throws IOException {
                test4();
                test3();
                test2();
                test();
        }

        /**
         * 获取URL指定的资源。
         *
         * @throws IOException
         */

        public static void test4() throws IOException {
                URL url = new URL("http://lavasoft.blog.51cto.com/attachment/200811/200811271227767778082.jpg");
                //获得此 URL 的内容。
                Object obj = url.getContent();
                System.out.println(obj.getClass().getName());
        }

        /**
         * 获取URL指定的资源
         *
         * @throws IOException
         */

        public static void test3() throws IOException {
                URL url = new URL("http://www.hrtsea.com/down/soft/45.htm");
                //返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
                URLConnection uc = url.openConnection();
                //打开的连接读取的输入流。
                InputStream in = uc.getInputStream();
                int c;
                while ((c = in.read()) != -1)
                        System.out.print(c);
                in.close();
        }

        /**
         * 读取URL指定的网页内容
         *
         * @throws IOException
         */

        public static void test2() throws IOException {
                URL url = new URL("http://www.hrtsea.com/down/soft/45.htm");
                //打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
                Reader reader = new InputStreamReader(new BufferedInputStream(url.openStream()));
                int c;
                while ((c = reader.read()) != -1) {
                        System.out.print((char) c);
                }
                reader.close();
        }

        /**
         * 获取URL的输入流,并输出
         *
         * @throws IOException
         */

        public static void test() throws IOException {
                URL url = new URL("http://lavasoft.blog.51cto.com/62575/120430");
                //打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
                InputStream in = url.openStream();
                int c;
                while ((c = in.read()) != -1)
                        System.out.print(c);
                in.close();
        }
}
 
四、Java所支持的URL类型
 
类型很多,通过下面这个工具可以测试,这个类来自[url]http://www.java2s.com/Tutorial/Java/0320__Network/ProtocolTester.htm[/url]
 
import java.net.URL;

public class MainClass {

        public static void main(String[] args) {

                String host = "www.java2s.com";
                String file = "/index.html";

                String[] schemes = {"http", "https", "ftp", "mailto", "telnet", "file", "ldap", "gopher",
                                "jdbc", "rmi", "jndi", "jar", "doc", "netdoc", "nfs", "verbatim", "finger", "daytime",
                                "systemresource"};

                for (int i = 0; i < schemes.length; i++) {
                        try {
                                URL u = new URL(schemes[i], host, file);
                                System.out.println(schemes[i] + " is supported\r\n");
                        } catch (Exception ex) {
                                System.out.println(schemes[i] + " is not supported\r\n");
                        }
                }
        }
}
 
另外,还可以通过协议处理器自定义协议。