指引网

当前位置: 主页 > 编程开发 > Java >

Java网络编程之URI、URL研究专题五

来源:网络 作者:佚名 点击: 时间:2017-11-14 05:55
[摘要] 在专题的上篇Java网络编程之URI、URL研究专题中我们介绍了URI、URL的慨念和体系结构,以及如何使用URI在本文中我将继续向大家介绍如何使用URL和MIME(多用途的网际邮件扩充协议)的概念以及它

  在专题的上篇Java网络编程之URI、URL研究专题中我们介绍了URI、URL的慨念和体系结构,以及如何使用URI在本文中我将继续向大家介绍如何使用URL和MIME(多用途的网际邮件扩充协议)的概念以及它如何与URL发生联系的。
  
  使用URL
  
  网络API通过提供URL类让我们能在源代码层使用URL。每一个URL对象都封装了资源的标识符和协议处理程序。前面的技巧显示了获得URL对象的途径之一是调用URI对象的toURL()方法。但是这种选择不一定方便(为什么在需要URL对象的时候必须建立URI对象呢?)。
  
  作为代替,你可以调用URL构造函数来建立URL对象。你也可以调用URL的方法来提取URL的组件,打开一个输入流(input stream)从资源中读取信息,获得某个能方便检索资源数据的对象的引用,比较两个URL对象中的URL,获得到资源的连接对象,该连接对象允许代码了解(并写入)更多的资源的信息。
  
  URL类有六个构造函数。其中最简单的是URL(String url),它有一个String类型的参数,把URL分解为自己的组件,并把这些组件存储在一个新的URL对象中。如果某个URL没有包含协议处理程序或该URL的协议是未知的,其它的五个构造函数会产生一个java.net.MalformedURLException对象。
  
  下面的代码片断演示了使用URL(String url)建立一个URL对象,该对象封装了一个简单的URL组件和http协议处理程序。
  
  URL url = new URL ("http://www.informit.com");
  
  一旦拥有了URL对象,你就可以使用getAuthority()、getDefaultPort()、 getFile()、 getHost()、 getPath()、getPort()、 getProtocol()、getQuery()、getRef()和getUserInfo(). The getDefaultPort()等方法提取各种组件。如果URL中没有指定端口的部分,getDefaultPort()方法返回URL对象的协议处理程序使用(资源定位)的默认端口。
  
  getFile()方法返回路径和查询组件的结合体。getProtocol()方法返回决定资源的连接类型(例如http、mailto、ftp)的协议的名称。getRef()方法返回URL的部分片断(我们所知道的引用)。最后,getUserInfo()方法返回授权机构组件的用户信息部分。
  
  在这些URL组件提取方法中,如果某些组件不存在(如果没有给URL对象的协议处理程序指定默认的端口,它也返回-1),这些方法就返回null或-1。
  
  作为这些组件提取方法的补充,你还可以调用openStream()方法检索java.io.InputStream引用。使用这种引用,你可以用面向字节的方式读取资源。
  
  列表4是URLDemo1的源代码。该程序从命令行参数建立了一个URL对象,调用URL组件提取方法来检索该URL的组件,调用URL的openStream()方法打开与资源的连接并返回一个用于从资源读取字节数据的InputStream引用,读取/打印这些字节,关闭输入流。
  
  列表4: URLDemo1.java
  
  // URLDemo1.java
  
  import java.io.*;
  
  import java.net.*;
  
  class URLDemo1
  
  {
  
  ublic static void main (String [] args) throws IOException
  
  {
  
  if (args.length != 1)
  
  {
  
  System.err.println ("usage: java URLDemo1 url");
  
  return;
  
  }
  
  URL url = new URL (args [0]);
  
  System.out.println ("Authority = "+ url.getAuthority ());
  
  System.out.println ("Default port = " +url.getDefaultPort ());
  
  System.out.println ("File = " +url.getFile ());
  
  System.out.println ("Host = " +url.getHost ());
  
  System.out.println ("Path = " +url.getPath ());
  
  System.out.println ("Port = " +url.getPort ());
  
  System.out.println ("Protocol = " +url.getProtocol ());
  
  System.out.println ("Query = " +url.getQuery ());
  
  System.out.println ("Ref = " +url.getRef ());
  
  System.out.println ("User Info = " +url.getUserInfo ());
  
  System.out.print ('\n');
  
  InputStream is = url.openStream ();
  
  int ch;
  
  while ((ch = is.read ()) != -1)
  
  System.out.print ((char) ch);
  
  is.close ();
  
  }
  
  }
  在命令行输入java URLDemo1 http://www.javajeff.com/articles/articles/html后,上面的代码的输出如下:
------分隔线----------------------------