读书笔记-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

相关文章

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原