读书笔记-java网络编程-5URL和URI-URL类

2024-06-10 18:48

本文主要是介绍读书笔记-java网络编程-5URL和URI-URL类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2. URL类

java.net.URL类是对url的抽象,是一个final类。URL类不可变,构造一个URL对象后,其字段不在改变,因此它是线程安全的。使用了策略设计模式。

2.1 创建新的URL

public URL(String url) throws MalformedURLException
public URL(String protocol, String hostname, String file) throws MalformedURLException
public URL(String protocol, String host, int port, String file) throws MalformedURLException
public URL(URL base,String relative) throws MalformedURLException
  • 支持协议
    所有虚拟机都支持:http、file
    java支持:https、jar、ftp
    一部分虚拟机:mailto、gopher,定制协议:doc、netdoc、systemresouce和java内部使用的verbatim

如果某个虚拟机不支持你需要的协议:
可以为该模式安装一个协议处理器
更建议的做法是为该协议定制一个API

除了验证能否识别URL模式外,java不会对它构造的URL完成任何正确性检查。而需要程序员去确认。

2.1.1 从字符串构造URL

public URL(String url) throws MalformedURLException

2.1.2 由组成部分构造URL

public URL(String protocol, String hostname, String file) throws MalformedURLException

这里将端口设为-1,所以会使用该协议的默认端口。
file参数应该以斜线开头,包括路径、文件名和可选的片段标识符。

2.1.3 构造相对URL

public URL(URL base,String relative) throws MalformedURLException

2.1.4 其他URL对象来源

  1. 在applet中,getDocumentBase()会返回包含这个applet的页面的URLgetCodeBase()会返回applet.class文件的URL。
  2. java.io.File类有一个toURL方法,返回与指定文件匹配的fileURL。
  3. 类加载器中。ClassLoader.getSystemResource(String name )返回一个URL,ClassLoader.getSystemResources(String name )返回一个URL列表。实例方法getResource(String name )会在所引用类加载器使用的路径中搜索指定资源的URL。

2.2 从URL获取数据

InputStream openStream()

在客户端和服务器之间完成必要的握手,返回一个InputStream,可以由此读取数据。
注意是使用释放模式或者带资源的try来确保Stream使用后关闭。
从这个Stream读取的数据是原始内容,如果原始内容是ascii码就是ascii码,如果是HTML就是HTML。
因此这里有一个比较麻烦的问题是如何确定读取原始内容的类型,当然有时还可以通meta数据读取。但是未必每次都能成功。有时候可以openConnection方法返回URLconnection对象来读取。

public URLConnection openConnection()

为指定的URL打开一个socket,并返回一个URLConnection对象。URLConnection表示一个网络资源的打开的连接。
如果希望与服务器直接通信,应该使用这个方法。通URLConnection,你可以访问服务器发送的所有数据。除了原始的文档,还可以访问协议指定的元数据。
这个方法还有一个重载版本

public URLConnection openConnection(Proxy proxy)

这会覆盖用平常的socksProxyHost、socksProxyPort、http.proxyHost、http.proxyPort、http.nonProxyHosts和类似的属性设置的任何代理服务器。
如果协议处理器不支持代理,这个参数将被忽略,如果可能将直接建立连接

public final Object getContent()

是下载URL引用数据的第三种方法。getContent()方法获取由URL引用的数据,尝试由它建立某种类型的对象。通常来说使用Object 来获取引用,然后用instanceof检测类型。通常来说需要猜测获得的类型。

2.3 分解URL

URL的每个部分都有对应的get方法。

http://www.ibiblio.org/javafaq/books/jnp/index.html?isbn=15623534#tocc

模式:http
授权机构:www.ibiblio.org
路径:/javafaq/books/jnp/index.html
片段标识符:tocc
查询字符串:isbn=15623534

http://admin@www.blackstar.com:8080/

授权机构:admin@www.blackstar.com:8080/
用户信息:admin
主机:www.blackstar.com
端口:8080

2.4 相等性和比较

当且仅当,URL指向相同的主机端口号和路径上的相同子元素,而且有相同的片段标识符和查询字符串时,才认为相等。

但是这样说了URL上的equals可能是一个阻塞的IO操作.出于这个原因,应该避免将URL存储在一来equals的数据结构中,如java.utl.HashMap。更好的选择是java.net.URI。可以在必要时将URI与URL来回转换

但是另一方面,equals还不够深入。不会具体的比较两个URL标识的资源。也没有实现Comparable接口。

还有一个sameFile方法类似于equals。但是这个方法不会考虑片段标识符

2.5 比较

toString
toExternalForm

toString总是将转换成绝对URL,toExternalForm也类似

toURI

这里需要说明一下URI的好处。URI 提供了更精确、更符合规范的行为。
对于绝对化和编码,在选择时应当首选URI类。
如果需要把URL存储在散列表或者其他数据结构中,也应该首选URI类,因为它的equals不会阻塞。
URL类主要用于从服务器下载内容。

这篇关于读书笔记-java网络编程-5URL和URI-URL类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048972

相关文章

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程