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码中的一个固定的子集,确切的讲,包括:

  • 大写字母A-Z
  • 小写字母a-z
  • 数字0-9
  • 标点符号 – _ . ! ~ * ' ,
  • 特殊用途的字符 / & ? @ # ; $ + = %

    就目前的而言只有上面的字符才能出现在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类的更多相关文章

    1. Java中的URL类

      Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...

    2. Java-->利用URL类下载图片

      --> 通过get 请求访问图片地址,将通过服务器响应的数据(即图片数据)存到本地文件中... --> HttpURLConnectionUtil 工具类 package com.drag ...

    3. java之URL类

      Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...

    4. Java URL类踩坑指南

      背景介绍 最近再做一个RSS阅读工具给自己用,其中一个环节是从服务器端获取一个包含了RSS源列表的json文件,再根据这个json文件下载.解析RSS内容.核心代码如下: class Presente ...

    5. MinerUrl.java 解析页面后存储URL类

      MinerUrl.java 解析页面后存储URL类 package com.iteye.injavawetrust.miner; /** * 解析页面后存储URL类 * @author InJavaW ...

    6. Java使用URL类下载的图片不完整

      问题 今天在使用URL类来下载网站中的图片的时候,出现了一个问题:下载的图片不完整,并且每次下载的图片大小也不是都相同,反正就是不完整. 问题代码如下: package cn.ganlixin.tes ...

    7. Java的URL类(二)

      转:https://www.cnblogs.com/brokencolor/p/8575440.html Java的URL类(二) 实例: Java 通过HttpURLConnection Post方 ...

    8. Java的URL类(一)

      转:https://www.cnblogs.com/blackiesong/p/6182038.html Java的URL类(一) Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平 ...

    9. [19/04/14-星期日] 网络编程_java.net包(InetAddress类、InetSocketAddress类、URL类)

      一.概念 Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能.Java虚拟机负责提供与操作系统的实际连接. InetAddress    作用:封装计算机的IP地址和 ...

    随机推荐

    1. 可轮播滚动的Tab选项卡

      前段时间有试着搭建个后台主题ui框架,有用到可支持滚动的Tab选项卡,模仿着H+后台主题ui框架中的代码造轮子改造了下,可惜代码在公司,不能把代码外发出来(感觉这样被限制了很多,对于这样的公司没办法, ...

    2. MyEclispe 2016 CI 0发布(附下载)

      | MyEclipse 2016 CI 0下载(免费试用30天) Eclipse Mars MyEclipse 2016基于Eclipse Mars 1 (4.5.1),除了在Eclipse基础上做了 ...

    3. iOS之2016面试题二

      前言 招聘高峰期来了,大家都非常积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,但是了解不够深.本篇文章为群里的小伙伴们去要出发公司的笔试题,由笔者整理并提供笔者个人参考 ...

    4. compileDebugJavaWithJavac

      学习笔记 compileDebugJavaWithJavac,缺少插件,在module app gradle文件最上面添加一段 apply plugin: 'me.tatarka.retrolambd ...

    5. Android开发学习——SQLite数据库与单元测试

      SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHelper  public class Myopenhelper extends SQLiteOpenHelp ...

    6. 我的第一个React Native App

      我用了三天时间实现了一个相对比较完整的React Native 新闻发布类型的示例.应用做得很简单,但大多React Native的组件都有用到,今天做一个分享(由于我电脑是Windows系统,所以只 ...

    7. numpy中matrix的特殊属性

      一.matrix特殊属性解释 numpy中matrix有下列的特殊属性,使得矩阵计算更加容易 摘自 NumPy Reference Release 1.8.1 1.1 The N-dimensiona ...

    8. 有氧运动 && 无氧运动

      有氧运动也叫做有氧代谢运动,是指人体在氧气充分供应的情况下进行的体育锻炼.有氧运动的好处是:可以提升氧气的摄取量,能更好地消耗体内多余的热量.也就是说,在运动过程中,人体吸入的氧气与需求相等,达到生理 ...

    9. ORA-14450: attempt to access a transactional temp table already in use

      在ORACLE数据中修改会话级临时表时,有可能会遇到ORA-14550错误,那么为什么会话级全局临时表会报ORA-14450错误呢,如下所示,我们先从一个小小案例入手: 案例1: SQL> CR ...

    10. VS2015 Git使用教程——优化项目编辑日志

      一.前言 公司项目中,修改日志管理是一件很繁琐的事情,而且项目维护时间长了,会遗留下各种有用或无用的日志,对于有代码洁癖的人来说,无疑是一种灾难. 1.公司日志记录结构: 2.Git日志记录结构: 二 ...