URLConnection(一)

news2024/11/19 4:19:18

文章目录

    • 1. 简介
    • 2. 打开URLConnection
    • 3. 读取服务器的数据
    • 4. 读取首部
    • 5. 获取任意首部字段

1. 简介

URLConnection是一个抽象类,表示指向URL指定资源的活动连接。URLConnection有两个不同但相关的用途。首先,与URL类相比,它对服务器(特别是HTTP服务器)的交互提供了更多控制。URLConnection可以检查服务器发送的首部,并相应地做出响应。它可以设置客户端请求中使用的首部字段,最后URLConnection可以用POST、PUT和其他HTTP请求方法向服务器发回数据。其次URLConnection类是JAVA的协议处理器机制的一部分,这个机制还包括URLStreamHandler类。协议处理器的思想很简单:它们将处理协议的细节与处理特定数据类型分开,提供相应的用户接口,并完成完整的Web浏览器所完成的其他操作。基类java.net.URLConnection是抽象类,要实现一个特定的协议,就要编写一个有奇怪模式的URL,它不会“绝望”地发出一个错误信息,而是会为这个未知协议下载一个协议处理器,用它与服务器通信。java.net包中只有抽象的URLConnection类。具体的子类都隐藏在sun.net包中。URLConnection的许多方法以及一个构造函数都是保护的,意味着它们只能有URLConnection类或其子类实例访问。

2. 打开URLConnection

直接打开URLConnetion类的程序遵循一下基本步骤:

  • 构造一个URL对象
  • 调用这个URL对象的openConnetion()获取对应URL的URLConnetion对象
  • 配置这个URLConnection
  • 读取首部字段
  • 获得输入流并读取数据
  • 获得输出流写入数据
  • 关闭连接

URLConnection类声明为抽象类,不过除了Connect方法,其他方法基本上它本身都已经实现了,所以其子类必须实现connect方法,该方法建立与服务器的连接,因而依赖与服务类型。第一次构造URLConnection时,它是未连接的,也就是说,本地和远程主机无法发送和接受数据。没有Socket连接这两个主机,connect()方法在本地和远程主机之间建立一个连接(一般使用TCP Socket),这样就可以收发数据了。不过我们一般不用显示的调用connect()方法,因为对于getInputStream()、getContent()、getHeaderField()方法和其他要求打开连接的方法,如果连接没有打开,这些方法内部会调用connect()方法

3. 读取服务器的数据

下面是使用URLConnection对象,从一个URL获取数据所需的最起码的步骤:

  • 构造一个URL对象
  • 调用这个URL对象的openConnection()方法,获取对应URL得URLConnection对象
  • 调用这个URLConnection的getInputStream()方法
  • 使用通常的流API读取输入流

下面使用URLConnection下载百度主页

public class QuizCardBuilder {
    public static void main(String[] args) {
       try{
           //定义URL对象
           URL u=new URL("http://www.baidu.com");
           //获取URLConnection对象
           URLConnection urlConnection=u.openConnection();
           //在try()中写入我们需要自动关闭的资源,后期会帮我们自动关闭
           try (InputStream raw=urlConnection.getInputStream()){
               //以流链的形式封装原始流,加入缓存提高IO效率
               InputStream buffer=new BufferedInputStream(raw);
               Reader reader=new InputStreamReader(buffer);
               int c;
               while((c=reader.read())!=-1){
                   System.out.print((char)c);
               }
           }
       } catch (MalformedURLException e) {
           throw new RuntimeException(e);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }
    }
}

在这里插入图片描述

对于这个例子这样一个简单的输入流,URL和URLConnection之间的区别并不明显

  • URLConnection提供了对HTTP首部的访问
  • URLConnection可以配置发送给服务器的请求参数
  • URLConnection除了读取服务器数据外,还可以向服务器写入数据

4. 读取首部

如下图我们在谷歌浏览器中看到我们请求的头信息,其主要包括六个部分:

  • Content-type:实际返回的内容的内容类型
  • Content-length:实际返回的内容的内容长度
  • Content-encoding:实际返回的内容的内容编码
  • Date:实际返回的内容
  • Last-modified:上一次在服务端的修改时间
  • Expires:头信息过期时间

在这里插入图片描述

下面介绍URLConnection的对应获取方法

  • public String getContentType()

该方法返回响应体的MIME内容类型,它一路web服务器发来的一个有效的内容类型。

public class QuizCardBuilder {
    public static void main(String[] args) {
       try{
           //定义URL对象
           URL u=new URL("http://www.baidu.com");
           //获取URLConnection对象
           URLConnection urlConnection=u.openConnection();
           //在try()中写入我们需要自动关闭的资源,后期会帮我们自动关闭
           System.out.println(urlConnection.getContentType());
       } catch (MalformedURLException e) {
           throw new RuntimeException(e);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }
    }
}

在这里插入图片描述

  • public int getContentLength()

告诉你内容有多少字节,如果没有Content-length首部就会返回-1.如果发现资源的长度超过Integer.MAXVALUE也会返回-1,下面代码实现了下载二进制文件。

public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            //定义URL对象
            URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");
            URLConnection urlConnection = u.openConnection();
            File mygram = new File("my.jpg");
            saveBinaryFile(u);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    public static void saveBinaryFile(URL u) throws IOException{
    //获得URLConnection对象
        URLConnection urlConnection=u.openConnection();
    //获得Content-type
        String contentype=urlConnection.getContentType();
        System.out.println("Contentype:"+contentype);
    //获得Content-length
        int contetnLength=urlConnection.getContentLength();
        System.out.println("ContentLength:"+contetnLength);
        if(contentype.startsWith("text/")||contetnLength==-1){
            throw new IOException("this is not a binary file");
        }
        //获得内容的IO流
        try(InputStream raw=urlConnection.getInputStream()){
            InputStream in =new BufferedInputStream(raw);
            byte[] data=new byte[contetnLength];
            int offset=0;
            while(offset < contetnLength){
                int bytesRead=in.read(data,offset,data.length-offset);
                if(bytesRead==-1) break;
                offset+=bytesRead;
            }
            try(FileOutputStream fout=new FileOutputStream("myimg.jpg")){
                fout.write(data);
                fout.flush();
            }
        }
    }
}

百度图片的信息
在这里插入图片描述

成功下载到本地
在这里插入图片描述

  • public String getContentEncoding()

该方法返回一个String,指出内容是如何编码的,如果发送的内容没有编码,这个方法就会返回null,而不抛出异常。

  • public long getDate

该方法返回一个long,指出文档何时发送,这个时间按格林乔治标准时间(GMT)

  • public long getExpiration()

有些文档基于服务器的过期时间,指示应当何时从缓存中删除文档,并从服务器重新下载。

  • public long getLastModified()

返回文档的最后修改日期。

5. 获取任意首部字段

上面的6个方法请求首部中的指定字段,不过对于一个消息中包含多少首部字段理论上没有限制,下面5个方法可以检索首部中的任意字段。

  • public String getHeaderField(String name)

该方法返回指定首部字段的值,首部的名称不区分大小写,也不包含结束冒号。

public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            //定义URL对象
            URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");
            URLConnection urlConnection = u.openConnection();
            System.out.println("ContenType:"+urlConnection.getHeaderField("Content-Type"));
            System.out.println("Date:"+urlConnection.getHeaderField("Date"));
            System.out.println("Last-Modified+"+urlConnection.getHeaderField("Last-Modified"));
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述

  • public String getHeaderFieldKey(int n)

这个方法返回第n个首部字段的键。请求方法本身就是第0个首部,它的键是null

public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            //定义URL对象
            URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");
            URLConnection urlConnection = u.openConnection();
            System.out.println("1:"+urlConnection.getHeaderFieldKey(1));
            System.out.println("2:"+urlConnection.getHeaderFieldKey(2));
            System.out.println("3:"+urlConnection.getHeaderFieldKey(3));
            System.out.println("4:"+urlConnection.getHeaderFieldKey(4));
            System.out.println("5:"+urlConnection.getHeaderFieldKey(5));
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述

  • public String getHeaderField(int n)

这个方法是返回第n个首部的值。在HTTP中,包含请求方法和路径的起始行是第0个首部。下面代码来显示所有首部:

public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            //定义URL对象
            URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");
            URLConnection urlConnection = u.openConnection();
            for (int i = 1; ; i++) {
                String header=urlConnection.getHeaderField(i);
                if(header==null)break;
                System.out.println(urlConnection.getHeaderFieldKey(i)+": "+header);
            }
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述

  • public long getHeaderFieldDate(String name,long default)

这个方法首先获取由name参数指定的首部字段,然后尝试将这个字符转换为一个long(GMT 1970年1月1日子夜之后经过的毫秒数)。它可以用来获取表示日期的首部字段。为了将字符串转换为整数,该方法使用了java.util.Date中的parseDate方法

public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            //定义URL对象
            URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");
            URLConnection urlConnection = u.openConnection();
            System.out.println(urlConnection.getHeaderFieldDate("Expires",0));
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述

  • public int getHeaderField(String name,int default)

这个方法获取首部字段name的值,尝试将其转换为int。

public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            //定义URL对象
            URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");
            URLConnection urlConnection = u.openConnection();
            System.out.println(urlConnection.getHeaderFieldInt("content-length",-1));
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/569362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:简介:什么是PythonShapiro?

简介&#xff1a;什么是Python Shapiro&#xff1f; Python Shapiro是一种用来进行正态性检验的工具&#xff0c;也就是说&#xff0c;它可以帮助我们检验一个给定的数据集是否符合正态分布的要求。它是从R语言中的Shapiro-Wilk测试方法改编而来的。 如何使用Python Shapiro&…

继瑞吉外卖后的又一个项目——SpringBoot+Vue的前后端博客系统

文章目录 博客系统项目介绍前言项目演示前台演示后台演示 组织结构后端组织结构前端组织结构 技术选型前端技术后端技术架构图系统架构图业务架构图 模块介绍前端模块后端模块 环境搭建开发工具开发环境项目运行 未完待续结语 博客系统项目介绍 前言 本项目已开源在Gitee 后端…

谈谈linux网络编程中的应用层协议定制、Json序列化与反序列化那些事

linux【网络编程】之协议定制、序列化与反序列化 一、序列化与反序列化二、应用层协议如何定制三、网络通信中数据流动的本质四、网络版计算器编写4.1 业务流程4.2 核心代码 一、序列化与反序列化 由于socket api的接口&#xff0c;在读写数据的时候是以字符串的方式发送接收的…

电子科技大学编译原理复习笔记(三):控制结构

目录 前言 重点一览 语句级控制结构 单元级控制结构 四种单元级控制结构 本章小结 前言 本复习笔记基于张老师的课堂PPT&#xff0c;供自己期末复习与学弟学妹参考用。 重点一览 语句级控制结构 定义&#xff1a;用来构造各种语句执行顺序的机制 传统三种语句级控制结…

Hyperledger Fabric explorer区块链浏览器搭建

https://github.com/hyperledger-labs/blockchain-explorer 官方浏览器的github地址 根据文档&#xff0c;采用docker容器的方法搭建explorer。 首先创建explorer的项目&#xff0c; mkdir explorer根据官方提供的文件&#xff0c;需要创建的目录结构如下&#xff1a; 这是官…

【计算机网络复习之路】网络层(谢希仁第八版)万字详解 主打基础

专栏&#xff1a;计算机网络复习之路 目录&#xff1a; 一、网络层的几个重要概念 1.1 网络层提供的两种服务 1.2 网络层的两个层面 二、网际协议 IP 2.1 虚拟互连网络 2.2 IP地址 2.2.1 IP地址及其表示方法 2.2.2 分类的IP地址 2.2.3 无分类编址CIDR &#xff08…

【2023 · CANN训练营第一季】应用开发(初级)第四章——模型推理

AscendCL运行资源管理 申请运行管理资源时&#xff0c;需按顺序依次申请: Device、Context、Stream&#xff0c;然后根据实际需求调用aclrtGetRunMode接口获取软件栈的运行模型(当同一个应用既支持在Host运行&#xff0c;也支持在Device运行时&#xff0c;在编程时需要就需要根…

k8s进阶5——AppArmor、Seccomp、ImagePolicyWebhook

文章目录 一、AppArmor限制容器对资源访问1.1 实现步骤1.1.1 定义策略1.1.2 加载策略1.1.3 引用策略 2.2 案例 二、Seccomp 限制容器进程系统调用案例一&#xff1a;使用自定义策略案例二&#xff1a;使用容器运行时默认策略 三、动态准入控制Webhook3.1 ImagePolicyWebhook控制…

PowerPoint输出图片分辨率设置

最近想用ppt画几张图&#xff0c;但是输出的分辨率有点不够意思&#xff0c;然后就想着改一下输出分辨率&#xff0c;这里记录一下方便以后查阅。 PowerPoint输出图片分辨率设置

PS-调色

图片的储存格式 JPEG格式&#xff1a;日常作图存储格式、只有一个图层、通用图片格式、内存小画质高 RAW格式&#xff1a;CR2、CR3佳能、NEF尼康、ARW索尼、IIQ哈苏、RAF富士、RW2松下 PNG格式&#xff1a;图片透明格式、用于抠出来的素材用这个格式保存可以是透明底没有背景 …

Linux——操作系统详解

目录 一.操作系统的含义 1.操作系统是什么&#xff1f; 2.那么操作系统为什么要对软硬件资源进行管理呢&#xff1f;这样做的好处在哪里&#xff1f; 3.操作系统又是怎么进行管理的&#xff1f; 如何理解“先描述&#xff0c;再组织”&#xff1f; 二.总结&#xff1a; …

conda环境安装使用教程

conda&#xff0c;anaconda&#xff0c;miniconda傻傻分得清楚 Conda是一个开源的包管理系统和环境管理系统&#xff0c;可以用于安装、管理和卸载软件包以及创建和管理虚拟环境。Anaconda是一个基于Python的数据科学平台&#xff0c;包括Python解释器、Conda包管理器、Jupyte…

Linux:为xfs文件系统卷 设置磁盘配额

首先准备一个xfs文件系统的 卷 || 分区 可以是逻辑卷 &#xff0c;也可以是普通卷&#xff0c;等等……但是他们的文件格式都要是xfs格式 我这里选择的是逻辑卷&#xff0c;普通卷也是一样的道理 开始前要有两个软件包需要安装 如果已安装直接看下一步 Linux&#xff1a;rpm…

一个人的旅行

说一下&#xff0c;两次的旅行。一次是三月底四月初&#xff0c;一次是四月底五月初。 我的第一站&#xff0c;帝都&#xff01;&#xff01;&#xff01; 31号晚上八点半的高铁去北京&#xff0c;到达北京已经快十二点了。武局的G528次列车。 来到北京后&#xff0c;这是我第…

Android开发环境搭建[Java1.7+eclipse+sdk4.0](某高校物联网工程专业必看!)

Android开发环境搭建[Java1.7eclipsesdk4.0]&#xff08;某高校物联网工程专业必看&#xff01;&#xff09; 0. 前言1. 资料拷贝2. 配置环境变量2.1新建 Java_Home2.2 编辑Path情况1情况2 2.3 新建sdk环境变量 3. 验证安装3.1 验证java安装情况3.2 验证eclipse安装 4. 导入已有…

《OrangeS一个操作系统的实现》中printf无法打印数字问题

【问题现象】 《OrangeS一个操作系统的实现》 第9章 a目录下的代码编译运行后&#xff0c;所有printf打印数字的地方都有问题&#xff0c;如下图&#xff1a; HD size 始终为 0MB。 【问题分析】 通过断点&#xff0c;发现printf第61行&#xff1a; int printf(const char *…

【历史上的今天】4 月 28 日:人工智能理论之父出生;大众点评上线;苹果开设 iTunes 音乐商店

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 28 日&#xff0c;在 1994 年的今天&#xff0c;美国克林顿政府公布了一项价值数百万美元的计划&#xff0c;以帮助那些制造平板显示屏的美国公司维持生计…

Filter详解

Filter是什么&#xff1a; Filter表示过滤器&#xff0c;是Java Web三大组件之一&#xff08;Servlet、Filter、Listener&#xff09;。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权…

chatgpt赋能python:PythonSearchDialog:利用Python编写高效的搜索对话框

Python Search Dialog&#xff1a;利用Python编写高效的搜索对话框 在当今数字时代&#xff0c;大多数产品都提供搜索功能。而Python Search Dialog 则为产品提供了一个强大、高效的搜索对话框&#xff0c;使得用户能够更快速地、更准确地定位所需信息。 什么是Python Search…

实验三:熟悉常用的HBase操作

实验环境&#xff1a; (1)操作系统&#xff1a;Linux(建议 Ubuntu 16.04 或 Ubuntu 18.04)。 (2)Hadoop 版本&#xff1a;3.1.3。 (3)HBase 版本&#xff1a;2.2.2。 (4)JDK 版本&#xff1a;1.8。 (5)Java IDE: Eclipse。 实验内容与完成情况&#xff1a; (1)现有以下关系数据…