URL类
java.net.URL类是对统一资源定位符(如http://www.lolcats.com)的抽象。它扩展了java.lang.Object,是一个final类。它采用策略模式,协议处理器(protocol handler)就是策略,URL类构成Context,通过它来选择不同的策略。
URL是一个字符串,但是对于URL类而言,这个字符串会被分解为URL类中的各个属性。URL类中的属性包括协议,主机名,端口,路径,查询字符串和片段标识。在构造了一个URL对象后其字段不再改变,所以URL是线程安全的。
构造URL对象
通过字符串构造URL对象
public URL(String url)
- try {
- URL u = new URL("http://www.xdysite.cn");
- } catch (MalformedURLException e) {
- System.out.println(e);
- }
通过组成部分构造URL
pulbic URL(String protocol, String hostname, String file)
pulbic URL(String protocol, String hostname, int port String file)
- try {
- //采用默认端口构造
- URL u1 = new URL("http", "www.xdysite.cn","/index.php");
- //使用8000端口构造
- URL u2 = new URL("http", "www.xdysite.cn", 8000, "/index.php");
- } catch (MalformedURLException e) {
- System.out.println();
- }
构造相对URL
public URL(URL base, String relative)
- try {
- URL u1 = new URL("http://www.xdysite.cn/javafaq/index.xml");
- URL u2 = new URL(u1, "mailinglists.html");
- } catch (MalformedURLException e) {
- System.out.println();
- }
如果有一个基础的URL(http://www.xdysite.cn/javafaq/index.html),通过上述方式可以构造出一个新的URL(http://www.xdysite.cn/javafaq/mailinglists.html)
从URL获取数据
直接打开流来获取数据
public final InputStream openStream()
该方法会直接从URL指向的资源中获取数据,如果资源是HTML页面,那么会直接获取页面的数据。并不会获取关于HTTP头部的信息。
- try {
- URL u = new URL("http://www.xdysite.cn/index.php");
- try(Reader r = new InputStreamReader(new BufferedInputStream(u.openStream()))){
- int c;
- while((c = r.read())!=-1){
- System.out.print((char)c);
- }
- }
- } catch (IOException e) {
- System.out.println(e);
- }
获取一个具体的对象
public final Object getContent()
该方法会获取URL指向的数据,并尝试建立某种类型的对象。如果URL指示某种文本(HTML/XML),返回的对象通常是某种InputStream。如果URL指示一个图像(如GIF或JPEG),getContent()通常会返回一个java.awt.ImageProducer。
- try {
- URL u = new URL("http://www.xdysite.cn/index.html");
- try(Reader r = new InputStreamReader(new BufferedInputStream((InputStream)u.getContent()))){
- int c;
- while((c = r.read())!=-1){
- System.out.print((char)c);
- }
- }
- } catch (IOException e) {
- System.out.println(e);
- }
URL编码问题
由于在发明Web时Unicode编码还没有普及,使得URL中使用的字符必须来自于ASCII码中的一个固定的子集,确切的讲,包括:
就目前的而言只有上面的字符才能出现在URL中.如果在URL中需要出现一些上面没有的字符时,需要对URL进行编码。
URLEncoder类
可以使用该类对一个字符串进行编码,编码后会将将结果转为%和两个十六进制数。现在通用的编码机制是UTF-8
- try {
- System.out.println(URLEncoder.encode("This is a string", "UTF-8"));
- System.out.println(URLEncoder.encode("This/is/a/string", "UTF-8"));
- System.out.println(URLEncoder.encode("This\"is\"a\"string", "UTF-8"));
- System.out.println(URLEncoder.encode("This_is.a-string*", "UTF-8"));
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
过度编码
在URL中允许出现的字符是不需要进行编码的。但是使用URL类时,会对斜线(/),与号(&),等号(=)进行编码。我们知道在URL中斜线(/)表示下一级目录。如果对其进行编码会导致我们无法访问资源。这就是过度编码问题。为了解决这个问题,我们需要逐步分对URL进行编码,而不是对整个URL进行编码。
- try {
- String query = URLEncoder.encode("http://www.baidu.com/s?wd=火影&sp=on", "UTF-8");
- System.out.println(query);
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
输出结果
我们看到URLEncoder对斜杠(/)都进行编码,这个不是我们想要的。我们只需要对“火影”进行编码即可。
- try {
- String query = "http://www.baidu.com/s?wd="+URLEncoder.encode("火影", "utf-8")+"&sp=on";
- System.out.println(query);
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
输出结果
由于使用UTF-8对“火影”进行编码后需要6个字节进行存储(每个汉字三个字节),所以显示出来是%E7%81%AB%E5%BD%B1,每个%后是一个字节,用十六进制表示。
URL类的更多相关文章
- Java中的URL类
Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...
- Java-->利用URL类下载图片
--> 通过get 请求访问图片地址,将通过服务器响应的数据(即图片数据)存到本地文件中... --> HttpURLConnectionUtil 工具类 package com.drag ...
- java之URL类
Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...
- Java URL类踩坑指南
背景介绍 最近再做一个RSS阅读工具给自己用,其中一个环节是从服务器端获取一个包含了RSS源列表的json文件,再根据这个json文件下载.解析RSS内容.核心代码如下: class Presente ...
- MinerUrl.java 解析页面后存储URL类
MinerUrl.java 解析页面后存储URL类 package com.iteye.injavawetrust.miner; /** * 解析页面后存储URL类 * @author InJavaW ...
- Java使用URL类下载的图片不完整
问题 今天在使用URL类来下载网站中的图片的时候,出现了一个问题:下载的图片不完整,并且每次下载的图片大小也不是都相同,反正就是不完整. 问题代码如下: package cn.ganlixin.tes ...
- Java的URL类(二)
转:https://www.cnblogs.com/brokencolor/p/8575440.html Java的URL类(二) 实例: Java 通过HttpURLConnection Post方 ...
- Java的URL类(一)
转:https://www.cnblogs.com/blackiesong/p/6182038.html Java的URL类(一) Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平 ...
- [19/04/14-星期日] 网络编程_java.net包(InetAddress类、InetSocketAddress类、URL类)
一.概念 Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能.Java虚拟机负责提供与操作系统的实际连接. InetAddress 作用:封装计算机的IP地址和 ...
随机推荐
- iOS 真机测试 App installation failed
真机测试的过程中,出现这种Bug This application's application-identifier entitlement does not match that of the in ...
- IOS开发基础知识--碎片17
1:contentSize.contentInset和contentOffset区别 contentSize 是scrollview中的一个属性,它代表scrollview中的可显示区域,假如有一个s ...
- 1-学习前言&C语言概述
[C语言]01-学习前言&C语言概述 参考自 http://www.cnblogs.com/mjios/archive/2013/03/12/2956508.html#label2 C语言是我 ...
- Linux 通过sendmail 发邮件到外部邮箱
最近在写自动化巡检脚本,想着怎么预警后自动发送邮件报警. 首先下载最新版本mailx-12.4.tar.bz2 # wget http://sourceforge.net/projects/heirl ...
- [Erlang 0104] 当Erlang遇到Solr
Joe Armstrong的访谈中有一段关于"打开黑盒子"的阐述,给我留下很深的印象:Joe Armstrong在做XWindows开发时没有使用对应的类库,而是在了解XW ...
- .NET Framework各版本比较
(1)本文比较了.NET Framework多个版本之间的区别,方便各位选择和切换.NET Framework. 版本号 发布日期 Visual Studio的版本 Windows上的默认情况 CLR ...
- Linux内核的文件预读readahead
Linux的文件预读readahead,指Linux系统内核将指定文件的某区域预读进页缓存起来,便于接下来对该区域进行读取时,不会因缺页(page fault)而阻塞.因为从内存读取比从磁盘读取要快很 ...
- SQL SERVER 2000 迁移后SQL SERVER代理服务启动错误分析
公司有一个老系统,这个系统所用的数据库是SQL SERVER 2000,它所在的Dell服务器已经运行超过10年了,早已经过了保修服务期,最近几乎每周会出现一次故障,加之5月份另外一台服务器坏了两个硬 ...
- C#:结构
1. 简单示例 // 定义结构 public struct Person { public string name; public int age; } class Program { static ...
- CLR via C# 读书笔记---常量、字段、方法和参数
常量 常量是值从不变化的符号.定义常量符号时,它的值必须能在编译时确定.确定后,编译器将唱两只保存在程序集元数据中.使用const关键字声明常量.由于常量值从不变化,所以常量总是被视为类型定义的一部分 ...