本书由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),本版针对Java 11全面更新。
建议与《卷I:基础知识》,一并阅读。
全书共分12章。
第1章介绍了Java中的流库;
第2章涵盖输入/输出处理,探讨了Java 11中引入的广受欢迎的改进和优化;
第3章介绍了XML,展示如何解析XML文件、生成XML和使用XSL转换;
第4章讲解了网络API,以及怎样连接到服务器、实现自己的服务器、创建HTTP连接,并讨论了新的HTTP客户端;
第5章介绍了数据库编程,重点讲解JDBC,即Java数据库连接API;
第6章涵盖如何使用新的日期和时间库来处理日历及时区;
第7章讨论国际化;
第8章介绍3种处理代码的技术;
第9章讲解从Java 9开始引入的Java平台模块系统,以促进Java平台和核心类库的有序演化;
第10章继续介绍Java安全模型,展示怎样编写类加载器和安全管理器,以及允许使用消息、代码签名、授权和认证及加密等重要特性的安全API;
第11章讨论没有纳入卷Ⅰ的所有Swing知识,包括树形构件、表格构件,以及Java 2D API;
第12章介绍本地方法,这个功能支持你调用为微软Windows API这样的特殊机制而编写的各种方法。
目录
- 译者序
- 前言
- 致谢
- 第1章 Java 8的流库 1
- 1.1 从迭代到流的操作 1
- 1.2 流的创建 3
- 1.3 f?ilter、map和f?latMap方法 8
- 1.4 抽取子流和组合流 9
- 1.5 其他的流转换 10
- 1.6 简单约简 11
- 1.7 Optional类型 13
- 1.7.1 获取Optional值 13
- 1.7.2 消费Optional值 13
- 1.7.3 管道化Optional值 14
- 1.7.4 不适合使用Optional值的方式 15
- 1.7.5 创建Optional值 16
- 1.7.6 用f?latMap构建Optional值的函数 16
- 1.7.7 将Optional转换为流 17
- 1.8 收集结果 19
- 1.9 收集到映射表中 24
- 1.10 群组和分区 27
- 1.11 下游收集器 28
- 1.12 约简操作 32
- 1.13 基本类型流 34
- 1.14 并行流 39
- 第2章 输入与输出 43
- 2.1 输入/输出流 43
- 2.1.1 读写字节 43
- 2.1.2 完整的流家族 46
- 2.1.3 组合输入/输出流过滤器 50
- 2.1.4 文本输入与输出 53
- 2.1.5 如何写出文本输出 53
- 2.1.6 如何读入文本输入 55
- 2.1.7 以文本格式存储对象 56
- 2.1.8 字符编码方式 59
- 2.2 读写二进制数据 61
- 2.2.1 DataInput和DataOutput接口 61
- 2.2.2 随机访问文件 63
- 2.2.3 ZIP文档 67
- 2.3 对象输入/输出流与序列化 70
- 2.3.1 保存和加载序列化对象 70
- 2.3.2 理解对象序列化的文件格式 74
- 2.3.3 修改默认的序列化机制 79
- 2.3.4 序列化单例和类型安全的枚举 81
- 2.3.5 版本管理 82
- 2.3.6 为克隆使用序列化 84
- 2.4 操作文件 86
- 2.4.1 Path 86
- 2.4.2 读写文件 89
- 2.4.3 创建文件和目录 90
- 2.4.4 复制、移动和删除文件 91
- 2.4.5 获取文件信息 92
- 2.4.6 访问目录中的项 94
- 2.4.7 使用目录流 95
- 2.4.8 ZIP文件系统 98
- 2.5 内存映射文件 99
- 2.5.1 内存映射文件的性能 99
- 2.5.2 缓冲区数据结构 105
- 2.6 文件加锁机制 107
- 2.7 正则表达式 109
- 2.7.1 正则表达式语法 109
- 2.7.2 匹配字符串 112
- 2.7.3 找出多个匹配 115
- 2.7.4 用分隔符来分割 117
- 2.7.5 替换匹配 117
- 第3章 XML 120
- 3.1 XML概述 120
- 3.2 XML文档的结构 122
- 3.3 解析XML文档 124
- 3.4 验证XML文档 133
- 3.4.1 文档类型定义 134
- 3.4.2 XML Schema 140
- 3.4.3 一个实践示例 142
- 3.5 使用XPath来定位信息 148
- 3.6 使用命名空间 152
- 3.7 流机制解析器 154
- 3.7.1 使用SAX解析器 154
- 3.7.2 使用StAX解析器 159
- 3.8 生成XML文档 162
- 3.8.1 不带命名空间的文档 162
- 3.8.2 带命名空间的文档 163
- 3.8.3 写出文档 163
- 3.8.4 使用StAX写出XML文档 165
- 3.8.5 示例:生成SVG文件 170
- 3.9 XSL转换 171
- 第4章 网络 180
- 4.1 连接到服务器 180
- 4.1.1 使用telnet 180
- 4.1.2 用Java连接到服务器 182
- 4.1.3 套接字超时 184
- 4.1.4 因特网地址 185
- 4.2 实现服务器 186
- 4.2.1 服务器套接字 186
- 4.2.2 为多个客户端服务 189
- 4.2.3 半关闭 192
- 4.2.4 可中断套接字 193
- 4.3 获取Web数据 199
- 4.3.1 URL和URI 199
- 4.3.2 使用URLConnection获取信息 201
- 4.3.3 提交表单数据 207
- 4.4 HTTP客户端 215
- 4.5 发送E-mail 221
- 第5章 数据库编程 225
- 5.1 JDBC的设计 225
- 5.1.1 JDBC驱动程序类型 226
- 5.1.2 JDBC的典型用法 227
- 5.2 结构化查询语言 227
- 5.3 JDBC配置 232
- 5.3.1 数据库URL 232
- 5.3.2 驱动程序JAR文件 233
- 5.3.3 启动数据库 233
- 5.3.4 注册驱动器类 234
- 5.3.5 连接到数据库 234
- 5.4 使用JDBC语句 237
- 5.4.1 执行SQL语句 237
- 5.4.2 管理连接、语句和结果集 240
- 5.4.3 分析SQL异常 240
- 5.4.4 组装数据库 242
- 5.5 执行查询操作 246
- 5.5.1 预备语句 246
- 5.5.2 读写LOB 252
- 5.5.3 SQL转义 253
- 5.5.4 多结果集 254
- 5.5.5 获取自动生成的键 255
- 5.6 可滚动和可更新的结果集 256
- 5.6.1 可滚动的结果集 256
- 5.6.2 可更新的结果集 258
- 5.7 行集 261
- 5.7.1 构建行集 262
- 5.7.2 被缓存的行集 262
- 5.8 元数据 265
- 5.9 事务 274
- 5.9.1 用JDBC对事务编程 274
- 5.9.2 保存点 275
- 5.9.3 批量更新 275
- 5.9.4 高级SQL类型 277
- 5.10 Web与企业应用中的连接管理 278
- 第6章 日期和时间API 280
- 6.1 时间线 280
- 6.2 本地日期 284
- 6.3 日期调整器 288
- 6.4 本地时间 289
- 6.5 时区时间 290
- 6.6 格式化和解析 294
- 6.7 与遗留代码的互操作 298
- 第7章 国际化 300
- 7.1 locale 300
- 7.1.1 为什么需要locale 300
- 7.1.2 指定locale 301
- 7.1.3 默认locale 303
- 7.1.4 显示名字 304
- 7.2 数字格式 305
- 7.2.1 格式化数字值 306
- 7.2.2 货币 310
- 7.3 日期和时间 311
- 7.4 排序和规范化 318
- 7.5 消息格式化 323
- 7.5.1 格式化数字和日期 324
- 7.5.2 选择格式 325
- 7.6 文本输入和输出 327
- 7.6.1 文本文件 327
- 7.6.2 行结束符 327
- 7.6.3 控制台 328
- 7.6.4 日志文件 328
- 7.6.5 UTF-8字节顺序标志 329
- 7.6.6 源文件的字符编码 329
- 7.7 资源包 330
- 7.7.1 定位资源包 330
- 7.7.2 属性文件 331
- 7.7.3 包类 332
- 7.8 一个完整的例子 333
- 第8章 脚本、编译与注解处理 348
- 8.1 Java平台的脚本机制 348
- 8.1.1 获取脚本引擎 348
- 8.1.2 脚本计算与绑定 349
- 8.1.3 重定向输入和输出 351
- 8.1.4 调用脚本的函数和方法 352
- 8.1.5 编译脚本 353
- 8.1.6 示例:用脚本处理GUI事件 354
- 8.2 编译器API 358
- 8.2.1 调用编译器 358
- 8.2.2 发起编译任务 359
- 8.2.3 捕获诊断消息 359
- 8.2.4 从内存中读取源文件 360
- 8.2.5 将字节码写出到内存中 360
- 8.2.6 示例:动态Java代码生成 362
- 8.3 使用注解 367
- 8.3.1 注解简介 368
- 8.3.2 示例:注解事件处理器 369
- 8.4 注解语法 373
- 8.4.1 注解接口 373
- 8.4.2 注解 375
- 8.4.3 注解各类声明 376
- 8.4.4 注解类型用法 377
- 8.4.5 注解this 378
- 8.5 标准注解 379
- 8.5.1 用于编译的注解 380
- 8.5.2 用于管理资源的注解 381
- 8.5.3 元注解 381
- 8.6 源码级注解处理 383
- 8.6.1 注解处理器 384
- 8.6.2 语言模型API 384
- 8.6.3 使用注解来生成源码 385
- 8.7 字节码工程 388
- 8.7.1 修改类文件 388
- 8.7.2 在加载时修改字节码 393
- 第9章 Java平台模块系统 395
- 9.1 模块的概念 395
- 9.2 对模块命名 396
- 9.3 模块化的“Hello, World!”程序 397
- 9.4 对模块的需求 398
- 9.5 导出包 400
- 9.6 模块化的JAR 403
- 9.7 模块和反射式访问 404
- 9.8 自动模块 406
- 9.9 不具名模块 408
- 9.10 用于迁移的命令行标识 409
- 9.11 传递的需求和静态的需求 410
- 9.12 限定导出和开放 411
- 9.13 服务加载 412
- 9.14 操作模块的工具 414
- 第10章 安全 417
- 10.1 类加载器 417
- 10.1.1 类加载过程 418
- 10.1.2 类加载器的层次结构 419
- 10.1.3 将类加载器用作命名空间 420
- 10.1.4 编写你自己的类加载器 421
- 10.1.5 字节码校验 426
- 10.2 安全管理器与访问权限 429
- 10.2.1 权限检查 429
- 10.2.2 Java平台安全性 431
- 10.2.3 安全策略文件 434
- 10.2.4 定制权限 439
- 10.2.5 实现权限类 440
- 10.3 用户认证 446
- 10.3.1 JAAS框架 446
- 10.3.2 JAAS登录模块 451
- 10.4 数字签名 459
- 10.4.1 消息摘要 460
- 10.4.2 消息签名 463
- 10.4.3 校验签名 465
- 10.4.4 认证问题 467
- 10.4.5 证书签名 469
- 10.4.6 证书请求 469
- 10.4.7 代码签名 470
- 10.5 加密 472
- 10.5.1 对称密码 473
- 10.5.2 密钥生成 474
- 10.5.3 密码流 478
- 10.5.4 公共密钥密码 479
- 第11章 高级Swing和图形化编程 483
- 11.1 表格 483
- 11.1.1 一个简单表格 483
- 11.1.2 表格模型 486
- 11.1.3 对行和列的操作 489
- 11.1.4 单元格的绘制和编辑 503
- 11.2 树 513
- 11.2.1 简单的树 514
- 11.2.2 节点枚举 526
- 11.2.3 绘制节点 528
- 11.2.4 监听树事件 530
- 11.2.5 定制树模型 536
- 11.3 高级AWT 544
- 11.3.1 绘图操作流程 544
- 11.3.2 形状 546
- 11.3.3 区域 560
- 11.3.4 笔画 561
- 11.3.5 着色 567
- 11.3.6 坐标变换 569
- 11.3.7 剪切 574
- 11.3.8 透明与组合 575
- 11.4 像素图 583
- 11.4.1 图像的读取器和写入器 583
- 11.4.2 图像处理 591
- 11.5 打印 604
- 11.5.1 图形打印 604
- 11.5.2 打印多页文件 612
- 11.5.3 打印服务程序 620
- 11.5.4 流打印服务程序 622
- 11.5.5 打印属性 625
- 第12章 本地方法 632
- 12.1 从Java程序中调用C函数 633
- 12.2 数值参数与返回值 637
- 12.3 字符串参数 639
- 12.4 访问域 644
- 12.4.1 访问实例域 644
- 12.4.2 访问静态域 648
- 12.5 编码签名 648
- 12.6 调用Java方法 650
- 12.6.1 实例方法 650
- 12.6.2 静态方法 653
- 12.6.3 构造器 654
- 12.6.4 另一种方法调用 654
- 12.7 访问数组元素 656
- 12.8 错误处理 659
- 12.9 使用调用API 663
- 12.10 完整的示例:访问Windows注册表 668
- 12.10.1 Windows注册表概述 668
- 12.10.2 访问注册表的Java平台接口 669
- 12.10.3 以本地方法实现注册表访问函数 670