JDK 核心包结构概述(下)
> 有些路很远,走下去会很累,可是,不走又会后悔。
> 米兰昆德兰
6 java.net
提供了用于实现网络应用程序的类。
java.net 包大致分为两个部分:
- 低层 API,用于处理以下抽象:
- 地址,网络标识符,如 IP 地址
- 套接字,基本双向数据通信机制
- 接口,描述网络接口
- 高层 API,用于处理以下抽象:
- URI,表示统一资源标识符
- URL,表示统一资源定位符
- 连接,表示到 URL 所指向资源的连接
6.1 地址
在整个 java.net API 中,地址或用作主机标识符,或用作套接字端点标识符。
InetAddress 类: IP(Internet 协议)地址的抽象。
它有两个子类:
- 用于 IPv4 地址的 Inet4Address
- 用于 IPv6 地址的 Inet6Address
但是,在大多数情况下,不必直接处理子类,因为 InetAddress 抽象应该覆盖了大多数必需的功能。
6.2 关于 IPv6
并非所有系统都支持 IPv6 协议,而当 Java 网络连接栈尝试检测它并在可用时透明地使用它时,还可以利用系统属性禁用它。在 IPv6 不可用或被显式禁用的情况下,Inet6Address 对大多数网络连接操作都不再是有效参数。虽然可以保证在查找主机名时 java.net.InetAddress.getByName 之类的方法不返回 Inet6Address,但仍然可能通过传递字面值来创建此类对象。在此情况下,大多数方法在使用 Inet6Address 调用时都将抛出异常。
6.3 套接字(Sockets)
套接字是在网络上建立机器之间的通信连接的方法。
java.net 包提供 4 种套接字:
Socket
TCP 客户端 API,通常用于连接远程主机
ServerSocket
TCP 服务器 API,通常接受源于客户端套接字的连接。
DatagramSocket
UDP 端点 API,用于发送和接收数据包
MulticastSocket
DatagramSocket 的子类,在处理多播组时使用。
使用 TCP 套接字的发送和接收操作需要借助 InputStream 和 OutputStream 来完成,这两者是通过
- Socket.getInputStream()
- Socket.getOutputStream()
方法获取。
6.4 接口
NetworkInterface 类提供 API 以浏览和查询本地机器的所有网络接口(例如,以太网连接或 PPP 端点)。
只有通过该类才可以检查是否将所有本地接口都配置为支持 IPv6。
6.5 高级 API
java.net 包中的许多类可以提供更加高级的抽象,允许方便地访问网络上的资源。这些类为:
URI
表示在 RFC 2396 中指定的统一资料标识符的类。顾名思义,它只是一个标识符,不直接提供访问资源的方法。
URL
表示统一资源定位符的类,它既是 URI 的旧式概念又是访问资源的方法。
URLConnection
根据 URL 创建的,是用于访问 URL 所指向资源的通信链接。此抽象类将大多数工作委托给底层协议处理程序,如 http 或 ftp。
HttpURLConnection
URLConnection 的子类,提供一些特定于 HTTP 协议的附加功能。
最佳实践
建议的用法是使用 URI 指定资源,然后在访问资源时将其转换为 URL。从该 URL 可以获取 URLConnection 以进行良好控制,也可以直接获取 InputStream。
URI uri = new URI("http://java.sun.com/"); URL url = uri.toURL(); InputStream in = url.openStream();
6.6 协议处理器
如上所述,URL 和 URLConnection 都依赖于协议处理器,协议处理程序必须存在;否则将抛出异常。此为与 URI 的主要不同点,URI 仅标识资源,所以不必访问协议处理器。因此,尽管可能利用任何种类的协议方案(例如,myproto://myhost.mydomain/resource/)创建 URI,但类似的 URL 仍将试图实例化指定协议的处理器;如果指定协议的处理器不存在,则抛出异常。
默认情况下,协议处理器从默认位置动态加载。但是,通过设置 java.protocol.handler.pkgs 系统属性也可能增加搜索路径。例如,如果将其设置为 myapp.protocols,则 URL 代码将首先尝试(对于 http 而言)加载 myapp.protocols.http.Handler,然后,如果失败,则尝试从默认位置加载 http.Handler。
注意,处理程序类必须为抽象类 URLStreamHandler 的子类。
7 java.text
提供与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。这意味着所编写的主程序是与语言无关的,并且可以依靠独立的、动态链接的本地化资源。这实现了随时为新本地化添加本地化的灵活性。
这些类能够格式化日期、数字和消息、解析、搜索和排序字符串,以及迭代字符、单词、语句和换行符。
此包包含三组主要的类和接口:
7.1 文本迭代 - CharacterIterator
StringCharacterIterator
StringCharacterIterator为字符串实现CharacterIterator协议。 StringCharacterIterator类迭代整个String。
AttributedCharacterIterator
AttributedCharacterIterator允许通过文本和相关属性信息进行迭代。属性是由键标识的键/值对。给定字符上的两个属性不能具有相同的键。
7.2 格式化解析 - Format
Format是抽象的基类,用于格式化对区域设置敏感的信息,例如日期,消息和数字。
Format定义了编程接口,用于将对语言环境敏感的对象格式化为String(格式方法),以及将String解析回对象(parseObject方法)。
子类
Java平台提供了三个专门的Format子类
- DateFormat
- MessageFormat
- NumberFormat
分别用于格式化日期,消息和数字。
同步性
Format通常非同步的。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则必须在外部进行同步。
NumberFormat
所有数字格式的抽象基类。
DecimalFormat
DecimalFormat是NumberFormat的一个具体子类,用于格式化十进制数字。将数值型数据格式化成我们需要的格式的字符串或将字符串数据反格式化为一个Number型对象。
ChoiceFormat
可以将格式附加到一系列数字。将数值型数据转化为我们需要显示的字符串,或将一个字符串转换为一个Number型对象。
DateFormat
DateFormat是日期/时间格式化子类的抽象类,该子类以与语言无关的方式格式化和解析日期或时间。
唯一子类
SimpleDateFormat
是一个具体的类,用于以对语言环境敏感的方式来格式化和解析日期。
MessageFormat
- Format抽象类中的非抽象子类
提供了一种以与语言无关的方式生成串联消息的方法。
7.3 整理字符串 - Collation
CollationElementIterator
用作迭代器,以遍历国际字符串的每个字符。使用迭代器返回所定位字符的排序优先级。字符的排序优先级(我们称为键)定义了如何在给定的整理对象中整理字符。
CollationKey
CollationKey表示特定整理者对象规则下的字符串。比较两个CollationKeys会返回它们表示的字符串的相对顺序。使用CollationKeys比较字符串通常比使用Collator.compare更快。因此,当必须多次比较字符串时,例如在对字符串列表进行排序时。使用CollationKeys更有效。
RuleBasedCollationKey
RuleBasedCollator类是Collator的一个具体子类,它提供了一个简单的,数据驱动的表整理器。使用此类,您可以创建基于表的自定义整理器。 RuleBasedCollator将字符映射到排序键。
8 java.sql
提供使用 Java 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。此 API 包括一个框架,凭借此框架可以动态地安装不同驱动程序来访问不同数据源。尽管 JDBC API 主要用于将 SQL 语句传递给数据库,但它还可以用于以表格方式从任何数据源中读写数据。通过接口的 javax.sql.RowSet 组可以使用的 reader/writer 实用程序,可以被定制以使用和更新来自电子表格、纯文本文件或其他任何表格式数据源的数据。
JDBC 4.2 API包括什么
JDBC 4.2 API既包含称为JDBC核心API的java.sql软件包,也包含称为JDBC可选软件包API的javax.sql软件包。此完整的JDBC API包含在Java标准版(Java SE)版本7中。javax.sql软件包将JDBC API的功能从客户端API扩展到服务器端API,它是必不可少的部分是Java Enterprise Edition(Java EE)技术的一部分。
版本
JDBC 4.2 API 综合了以前所有 JDBC API 版本:
类、接口、方法、字段、构造方法和异常都有以下 "since" 标记,以指示它们何时被引入 Java 平台。当将这些 "since" 标记用于 JDBC API 的 JavadocTM 注释时,它们指示以下内容:
注:许多新特性都是可选的,因此,在这些版本支持的驱动程序和特性中有一些变体。在尝试使用它之前,总是检查驱动程序的文档,以查看它是否支持某一特性。
注:SQLPermission 类被添加到 JavaTM 2 SDK 标准版 1.3 版中。此类用于防止对与 DriverManager 相关联的记录流进行无授权访问,该流可以包含诸如表名称、列数据等信息。
java.sql 包含的内容
JDBC 各大版本 API 中引入的 java.sql 和 javax.sql 特性
-
4.2
-
4.1 API
-
4.0
-
3.0
-
2.1
-
2.0
UDT 的自定义映射关系
可以将 SQL 中定义的用户定义类型 (UDT) 映射到 Java 编程语言中的类。SQL 结构化类型或 SQL DISTINCT 类型是可以自定义映射的 UDT。以下三个步骤设置了一个自定义映射关系:
- 在 SQL 中定义 SQL 结构化类型或 DISTINCT 类型
- 定义 Java 编程语言中的类,SQL UDT 将映射到该类。此类必须实现 SQLData 接口。
- 在 Connection 对象的类型映射表中创建一个项,该项包含两项内容:
- UDT 的完全限定 SQL 名称
- 实现 SQLData 接口的类的 Class 对象
为 UDT 准备好这些之后,在该 UDT 上调用 ResultSet.getObject 或 CallableStatement.getObject 方法将自动获取该 UDT 的自定义
9 总结
JDK 几个核心包的总结至此,本专刊限于篇幅和精力不可能将所有类深入细致详解,但所讲解的类和接口都是核心包中的核心,同时也是面试必问的。源码的学习方法都是类似的,相信大家在学习完本专刊后,也将更加轻松阅读更多更复杂的源码。