Java的网络类可以让你通过网络或者远程连接来实现应用。而且,这个平台现在已经可以对国际互联网以及URL资源进行访问了。Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷。我们通过使用Java的URL类就可以经由URL完成读取和修改数据的操作。
通过一个URL连接,我们就可以确定资源的位置,比如网络文件、网络页面以及网络应用程序等。其中包含了许多的语法元素。
从URL得到的数据可以是多种多样的,这些都需要一种统一的机制来完成对URL的读取与修改操作。Java语言在它的java.net软件包里就提供了这么一种机制。
URL class是从URL标示符中提取出来的。它允许Java程序设计人员打开某个特定URL连接,并对里边的数据进行读写操作以及对首部信息进行读写操作。而且,它还允许程序员完成其它的一些有关URL的操作。
构造
在创建java.net URL的实例的时候,你能够利用许多公共构造器,从而让其变得更具灵活性。举个例子来说,这个class提供了一种使用完整URL信息串的构造器,一种使用把URL信息串分解成为协议、主机名以及文件和资源的构造器,还有一种把URL信息串分解成为协议、主机名、端口号以及文件的构造器。我们首先使用完整的URL来创建一个URL class的例子:
URL aURL = new URL(“http://www.mycompany.com:8080/index.html”);
在这个例子中,我们创建了一个使用完整URL的URL class,其中明确指出了使用的协议是http,主机名称是www.mycompany.com,端口号码为8080,文件/资源为index.html。如果组成URL的语法发生了错误,那么构造器就会发出MalformedURLException。
连接
一旦你成功的创建了一个URL class的实例,你就可以对其进行操作了。但是在你能够访问这个URL上的资源和内容之前,你必须要打开到这些资源与内容上的连接。你可以通过使用openConnection来完成这一操作。
使用openConnection并不需要参数,并且在操作成功之后,它会返回一个URLConnection class的实例。在Listing A中,向我们演示了打开一个到URL连接的过程。一旦你的连接成功,你就可以开始对这个URLConnection的输入以及输出流进行读和写的操作了。
从URL连接中读取数据
使用java.io stream class来从URL中读取数据是一个非常简单的过程。一旦你建立了一个成功的连接,那么你就可以获得针对这个连接的输入流并且开始进行写的操作了。很幸运的是,java.io classes可以以与对文件流或者socket流进行操作的同样方式进行对从URLConnection流返回的数据进行操作。
对URL进行写的操作
使用java.io stream classes对URL进行写的操作同样也是非常简单的。一旦你建立了一个成功的连接之后,你就可以得到来自此连接的输出流并且开始进行写的操作。当然,只有对于客户所希望的数据进行写的操作才是有意义的。同样的,在获得并对URLConnection流进行写的操作之前,你还需要使用setDoOutput(boolean)方式把输出(Output)属性设置为真(true)来指定可以进行写操作的那些连接。Java.io classes允许你把数据写到URLConnection流,这个操作也和你对文件流和socket流进行的写操作一样。
其它的操作
你可以从URL以及URLConnection对象连接中得到其它类型的信息,比如说主机名、端口、内容长度、内容编码以及内容的类型。把这些方法连同stream I/O classes一起使用可以让你建立复杂而有效的网络客户应用程序和服务。
对网络的便捷访问
由Java平台所提供的URL class让我们可以方便而有效的访问网络上的资源,而且可以让我们象访问本地文件一样的感到轻松愉快。我们不用为网络通讯的细节问题操心,只需要把注意力集中到制作有用的应用程序和服务上去。
// 方法一
URL url = new URL("http://www.sina.com.cn");
URLConnection urlcon = url.openConnection();
InputStream is = urlcon.getInputStream();
// 方法二
URL url = new URL("http://www.yhfund.com.cn");
HttpURLConnection urlcon = (HttpURLConnection)url.openConnection();
InputStream is = urlcon.getInputStream();
//方法三
URL url = new URL("http://www.yhfund.com.cn");
InputStream is = url.openStream();
long begintime = System.currentTimeMillis();
URL url = new URL("http://www.yhfund.com.cn");
HttpURLConnection urlcon = (HttpURLConnection)url.openConnection();
urlcon.connect(); //获取连接
InputStream is = urlcon.getInputStream();
BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
StringBuffer bs = new StringBuffer();
String l = null;
while((l=buffer.readLine())!=null){
bs.append(l).append("/n");
}
System.out.println(bs.toString());
//System.out.println(" content-encode:"+urlcon.getContentEncoding());
//System.out.println(" content-length:"+urlcon.getContentLength());
//System.out.println(" content-type:"+urlcon.getContentType());
//System.out.println(" date:"+urlcon.getDate());
}catch(IOException e){
System.out.println(e);
}
}
}
/**
* 把输入流转换成字符数组
* @param inputStream 输入流
* @return 字符数组
* @throws Exception
*/
public static byte[] readStream(InputStream inputStream) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
bout.write(buffer, 0, len);
}
bout.close();
inputStream.close();
return bout.toByteArray();
}
构造方法
URL(Uniform Resource Locator)是一个指向网络上资源的引用(或地址)。
可以通过向Web浏览器提供URLs来定位Internet上的文件。
互联网上彼此交互的Java程序也可使用URL在互联网上找寻其想要访问的资源。Java程序可以使用java.net包下的URL类代表URL地址。
1 什么是URL
URL使用字符串形式描述如何在Internet上找寻一个资源。URLs由两个主要的组成部分:访问资源需要的协议以及资源的位置。
虽然不是很准确,但可以将URL看作World Wide Web上的文件的名称,因为大多数的URL是指网络中某些机器上的文件。不过,需要注意,URL也可以指网络中的其他资源,例如数据库查询与命令输出。
URL有两个主组件:
协议标识符 e.g. http://sdsadf.dfs中,协议标识符为http
资源名称 e.g. http://example.com中,资源名称为example.com
注意:协议标识符与资源名称之间由一个冒号与两个前斜杠隔开。
协议标识符指出了用于获取资源的协议的名称。
资源名称是资源的完整地址。资源名称的格式完全依赖于使用的协议。对于大多协议来说,资源名称包含一些相同组件:
主机名称:资源所在机器的名称
文件名:文件位于机器上的路径
端口号:选择连接的端口(通常为可选)
引用:用于表示文件中特定位置的资源中的已命名锚的引用(通常为可选)
对于大多数协议来说,主机名与文件名是必须的,而端口号与引用是可选的。
1、创建URL对象的一个简单方法是通过一个表示可读形式的URL地址的String来创建。
URL myURL = new URL("http://example.com/");
ps:这种方法创建出的URL代表绝对URL。
ps:绝对URL包含了抵达相关资源的所有信息。
2、创建相对于其他URL的URL对象
URL(URL baseURL, String relativeURL)
相对URL只包含抵达相对于其他URL的资源的充足信息。
相对URL规格通常被用于HTML文件中。
假设,有三个HTML文件,A.html、B.html、C.html,这三个文件位于同一台机器的同一个目录下,此时A.html中关于B.html与C.html的链接只需要提供文件名即可。
<a href="B.html">B</a>
<a href="C.html">C</a>
note:这些URL地址即为相对URL。
以此类推,假设hhh.com下有两个URL:http://hhh.com/dir/a、http://hhh.com/dir/b。
那么通过相对地址创建URL对象即:
URL my = new URL("http://hhh.com/dir/");
URL a = new URL(my, "a");
URL b = new URL(my, "b");
3、其他URL构造器
URL额外提供了两种构造器来创建URI对象。
new URL("http", "eee.com", "/sss");
note:http://eee.com/sss
note:第一个参数为协议名,第二个为主机名,第三个为文件的路径名。
注意,文件名在开始处包含一个前斜杠。这表示文件名是从主机的根目录处定义的。
URL url = new URL("http", "eee.com", "80", "aaa");
note:http://eee.com/sss
如果使用这些构造器构造URL,可以通过URL的toString方法或其等价的toExternalForm方法获取完整的String形式的URL地址。
4、带有特殊字符的URL地址
一些URL地址包含特殊字符,例如空格符。e.g. http://eee/iii ooo/
在将这些字符传入URL构造器之前,需要对这些字符进行编码实质合法化。
URL url = new URL("http://eee/iii%20ooo");
当URL地址中存在多个需要编码的字符时,为了确保正确,可以使用java.net.URI类的多参构造器来自动处理编码。
URI uri = new URI("http", "eee", "/iii ooo/", "");
URL url = uri.toURL();
如果构造器参数引用null或一个未知的协议,URL构造器将会抛出一个MalformedURLException。
注意:URLs是“一次写入”对象。一旦完成URL对象的创建,便不能再修改它的属性,即协议、主机名、文件名、端口号等。