一、简述:

在Java网络编程中,我们最常听到的一个单词是URL。URL标识了一个资源,并可以通过URL来获取这个资源。我们不知道资源具体是什么,也不需要关心怎么获取。你只需要拿到一个URL,你就可以定位到其对应的资源,并获取这个资源。所以,URL对于互联网来说是一个非常简单但是效用极高的设计。

URL:URL全称叫做uniform resource locator,直译为“统一资源定位符”。简单地说,URL标识了互联网中的资源,并可以通过URL来获取资源。

URI:而除了URL,URI也是经常见到的。URI全称叫做uniform resource identifier,直译为“统一资源标识符”。简单地说,URI就是标识了互联网中的某个资源。但是并不像URL那样还可以通过URI来获取资源。

所以,URL是URI的一个子集,也可以说URL就是一种URI,可以用来标识资源。但是URL比URI增强了一种获取资源的特性。在互联网中我们也更常地去使用URL。

二、什么是URL类:

URL类,是在JDK中的java.net包下,它直接继承了object类。既然是一个类,那么就得知道怎么获得它的实例对象。

JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/net/URL.html

URL的构造方法有六种,这里使用其中字符串的形式:

URL(String spec) // 根据String表示形式创建URL对象

有了URL,我们就定位到了一个资源。

注意:如果构造方法中指定的协议不是URL所支持的,那么会抛出MalformedURLException,所以你也可以通过这种方式来测试URL对各种协议的支持。

但,JDBC和RMI这两种协议URL是不显示支持的,在JDBC包和RMI包自己内置支持。

什么是URLConnection

我们使用URL定位到了资源,同时我们也希望读取或者写入数据。URLConnection封装了这些细节

JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/net/URLConnection.html

URL类提供了一个方法:openConnection(),该方法返回一个URLConnection对象。URLConnection也是直接继承自object,它代表应用程序和URL之间的通信链接。可以用于读取和写入此URL引用的资源。

URLConnection是一个抽象类,httpURLConnection则是URLConnection的直接子类。

创建一个到URL的连接步骤

  1. 通过在URL上调用openConnection方法创建连接对象;
  2. 处理设置参数和一般请求属性;
  3. 使用connect方法建立远程对象的实际连接。
  4. 远程对象变未可用。远程对象的头字段和内容变为可访问。

三、代码示例

以下代码演示HttpUrlConnection

JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/net/HttpURLConnection.html

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; public class UrlConnectionDemo {
private static final String string = "http://domain/path";
private static final String queryString = "name=lay&age=23"; public static void main(String[] args) {
URL url = null;
HttpURLConnection urlConnection = null;
Writer writer;
InputStream inputStream;
BufferedReader reader;
OutputStream outputStream;
try {
// 构建URL
url = new URL(string);
// 构建连接对象,还未连接
urlConnection = (HttpURLConnection) url.openConnection();
// 设置请求方法,默认是GET
urlConnection.setRequestMethod("POST");
// 设置超时时间
urlConnection.setConnectTimeout(60000);
urlConnection.setReadTimeout(30000);
// 是否缓存,默认为true
urlConnection.setUseCaches(true);
// 添加请求头
urlConnection.addRequestProperty("key", "value");
// 写入数据
// 默认是false,需要显示设置
urlConnection.setDoOutput(true);
outputStream = urlConnection.getOutputStream();
writer = new OutputStreamWriter(outputStream);
writer.write(queryString);
// 显示执行连接
urlConnection.connect();
// 允许输入,默认即是true,不需要显示设置
urlConnection.setDoInput(true);
// 获取输入流
inputStream = urlConnection.getInputStream();
// 链式包装读取器
reader = new BufferedReader(new InputStreamReader(inputStream));
// 读取数据
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
// 打印结果
System.out.println(stringBuilder);
} catch (MalformedURLException e) {
System.out.println("URl不支持该协议, protocol=" + url.getProtocol());
} catch (IOException e) {
System.out.println("出现了IO异常");
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
} }

注意点:

  1. 经测试这里的connect()方法可以省略,因为getInputStream或者getOutputStream隐含着connect()连接操作;
  2. 该连接默认是GET请求,如果需要post请求可以使用setRequestMethod方法进行设置;
  3. 如果使用post方式,请求参数可以通过OutputSteam进行写操作,那就需要setDoOutput设置为true,默认是false;(setDoInput默认是true所以不用设置既可以读取响应的内容)
  4. 如果需要更为详细的信息可以参考JDK的URL类和URLConnection类的帮助文档。 
  5. Java的网络编程需要遵从释放模式,即在finally需要对打开的连接或者流进行关闭,当然你也可以使用try-with-resources的方式,而不用显示关闭。

  

一、URL和URLConnection的更多相关文章

  1. Java 网络编程:必知必会的 URL 和 URLConnection

    java.net.URL 类将 URL 地址进行了封装,并提供了解析 URL 地址的基本方法,比如获取 URL 的主机名和端口号.java.net.URLConnection 则代表了应用程序和 UR ...

  2. java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例

    什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...

  3. Java——URL和URLConnection

    使用URL读取内容 import java.awt.im.InputContext; import java.io.InputStream; import java.net.MalformedURLE ...

  4. URL,URLConnection,HttPURLConnection的使用

    URLConnection与HttPURLConnection都是抽象类,无法直接实例化对象.其对象主要通过URL的openconnection方法获得. 值得注意的是:1.openConnectio ...

  5. java URL和URLConnection

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. 转:URL,URLConnection,HttPURLConnection的使用

    URLConnection与HttPURLConnection都是抽象类,无法直接实例化对象.其对象主要通过URL的openconnection方法获得. 值得注意的是:1.openConnectio ...

  7. android和网络连接相关的类URL,URLConnection,HttpURLConnection,HttpClient

    这几个类都是用于和服务器端的连接,有些功能都能够实现,关系是: 一.URL URL标识着网络上的一个资源:该类包含一些URL自身的方法,如获取URL对应的主机名称,端口号,协议,查询字符串外,还有些方 ...

  8. Java实现多线程下载 URL以及URLConnection

    主线程: public class MultiThreadDown { public static void main(String[] args) throws Exception{ //初始化Do ...

  9. Java中的URL类

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

随机推荐

  1. [BZOJ4530][Bjoi2014]大融合(LCT)

    传送门 大佬们似乎都是用树剖+并查集优雅地A了此题 然后我太弱了,只能打打LCT的板子 虽然的确可以挺无脑的A掉…… 不过至少这题教了我该怎么维护LCT上虚子树的信息,具体看这里 首先,答案很明显是断 ...

  2. 2017qcon大会的一点想法(安全人才如何不被淘汰?)

    2017 qcon 上海专门设立了“直击黑产,业务安全的攻与防”专题,通过这次专题的了解和学习,让我对黑产的攻防有了更深入认识. 1. 安全防护趋势 2017 qcon 上海专门设立了“直击黑产,业务 ...

  3. Python3之redis使用

    简介 redis是一个key-value存储系统,和Memcache类似,它支持存储的value类型相对更多,包括string(字符串),list(列表),set(集合),zset(有序集合),has ...

  4. 2019.2.14 t3 车辆销售

    用算法求最大生成树,在并查集合并时,把原本的一个根连向另一个 根改成两个根都连向一个新建的节点,并把当前正在处理的边的权值赋给这个新 节点做点权.这样形成的结构会是一棵树. 一个点的答案大致上是树的根 ...

  5. Ant demo

    <?xml version="1.0" encoding="UTF-8"?> <!-- 定义一个工程,默认任务为warFile. --> ...

  6. maven 打包 源代码

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-sourc ...

  7. 高阶篇:1)竞品(标杆产品)的拆解和分析benchmarking

    本章目的:从标杆产品(竞品)逆向推出装配.制造.设计流程及难点. 1.竞品分析的目的 ①为企业制定市场准确的产品开发目标: ②为企止提供产品开发全流程性能结构对标参考数据指标: ③最优性价比务件下,为 ...

  8. 解决php -v查看到版本于phpinfo()打印的版本不一致问题

    https://blog.csdn.net/haif_city/article/details/81315372 整个事件的起因是这样的 通过git拉取laraevl项目发现缺少.env文件,打算使用 ...

  9. springboot和quartz整合实现动态定时任务(持久化单节点)

    Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制,它支持定时任务持久化到数据库,从而避免了重启服务器时任务丢失,支持分布式多节点,大大的 ...

  10. Zookeeper概念学习系列之分布式事务

    不多说,直接上干货! 初学者来说,肯定会有这么一个疑问.为什么会在zookeeper里牵扯到分布式事务? zookeeper到底是什么? zookeeper实际上是yahoo开发的,用于分布式中一致性 ...