编辑推荐
适读人群:《Java经典实例(第三版)》广大Java程序员。
《Java经典实例(第三版)》对于Java程序员来说是理想的“第二《Java经典实例(第三版)》”,300个Java应用经典技巧,涵盖了广泛的Java主题。内容简介
《Java经典实例(第三版)》从lambda表达式、JavaFX8,到网络编程和支持移动设备等方面,Java8都有许多更新。包含了数百个经过实践验证的技巧,内容涵盖了广泛的Java主题,可帮助你快速进入编程状态。你可以从中学到一切有用的技术,包括调试、数据结构、GUI开发和函数编程。 的每个技巧既给出了代码部分,也给出了运行结果,还有对它们的讨论。你可以免费使用这些代码。如果你对Java基础知识比较熟悉,学习将使你进一步掌握语言方面的通用知识和Java8中主要API方面的特殊知识。 的主题包括: 1.用于编译、运行和调试的方法。 对文本的处理、比较和重新安排。 2.用于字符串匹配和模式匹配的正则表达式。 ?处理数字、日期和时间。 3.使用集合、数组和其他类型实现数据的结构化。 4.面向对象技术和函数编程技术。 5.目录和文件系统运算符。 6.使用图形、视频和音频。 7.GUI开发,包括JavaFX和处理器。 8.客户端和服务器端的网络编程。 9.数据库访问,使用JPA、Hibernate和JDBC。 10.处理JSON和用于数据存储的XML。 11.多线程和并发机制。作者简介
IanF.Darwin,已在计算机工业界工作了三十年。除了编程和提供咨询,Ian还为LearningTreeInternational公司讲授UNIX、C和Java,这是一家世界上zui大的培训公司之一。他还编写了《CheckingCProgramswithLint》(O'Reilly公司出版)一书,以及超过100篇有关C和UNIX方面的文章。精彩书评
业界评论 “O’ReillyRadar博客有口皆碑。” ——Wired
“O’Reilly凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。” ——Business2.0
“O’ReillyConference是聚集关键思想领袖的绝对典范。” ——CRN
“一本O’Reilly的书就代表一个有用、有前途、需要学习的主题。” ——IrishTimes
“Tim是位特立独行的商人,他不光放眼于zui长远、zui广阔的视野并且切实地按照YogiBerra的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去Tim似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。” ——LinuxJournal目录
前言.1
第1章入门:编译、运行和调试Java程序.19
1.0引言.19
1.1编译和运行Java程序:JDK方式20
1.2用带语法高亮显示的编辑器编辑和编译程序21
1.3使用IDE编译、运行和测试程序22
1.4有效使用CLASSPATH.30
1.5下载和使用代码示例.32
1.6使用Ant工具自动编译37
1.7使用ApacheMaven自动设置依赖关系、编译、测试和部署.40
1.8使用Gradle自动设置依赖关系、编译、测试和部署.45
1.9处理过期警告46
1.10没有#ifdef的条件编译.48
1.11使用断言机制维护程序的正确性.50
1.12使用JDB调试.51
1.13用单元测试避免调试.53
1.14用持续集成维护代码.56
1.15获取可读回溯60
1.16更多的Java源代码:程序、框架和库61
第2章与运行环境交互65
2.0引言.65
2.1获得环境变量65
2.2从系统属性获得信息.67
2.3了解当前的JDK版本68
2.4编写操作系统相关的代码69
2.5使用扩展包或其他API包.72
2.6解析命令行参数73
第3章字符串80
3.0引言.80
3.1用Substring分解字符串.82
3.2将字符串分解成词.83
3.3用StringBuilder连接字符串.87
3.4处理单个字符串89
3.5字符串对齐.91
3.6Unicode字符和String之间的转换93
3.7按单词或字符颠倒字符串96
3.8扩展和压缩Tab97
3.9控制字母大小写101
3.10缩排文本文档102
3.11输入非打印字符103
3.12删除字符串的尾部空格.104
3.13解析用逗号分隔的数据.106
3.14程序:一个简单的文本格式化工具.110
3.15程序:Soundex算法.112
第4章正则表达式的模式匹配116
4.0引言.116
4.1正则表达式语法118
4.2在Java中使用正则表达式:测试模式124
4.3找到匹配的文本128
4.4替换匹配的文本130
4.5打印匹配的所有字符串.132
4.6打印包含一个模式的行.134
4.7在正则表达式中控制大小写135
4.8匹配“重音符”或复合字符136
4.9在文本中匹配换行符.138
4.10程序:Apache日志文件解析.139
4.11程序:数据挖掘.141
4.12程序:完整的Grep.143
第5章数字.149
5.0引言.149
5.1检查字符串是否是有效数字151
5.2用小数据类型储存大数据类型的数字.153
5.3数字与对象的相互转换.154
5.4直接使用分数而不用浮点数155
5.5保证浮点数的准确.157
5.6比较浮点数159
5.7舍入浮点数160
5.8格式化数字161
5.9二进制、八进制、十进制和十六进制之间的转换164
5.10对整数序列的操作.165
5.11使用罗马数字166
5.12复数的正确格式化.170
5.13生成随机数172
5.14计算三角函数174
5.15取对数.175
5.16矩阵乘法176
5.17使用复数178
5.18处理非常大的数字180
5.19程序:TempConverter182
5.20程序:数字回文.184
第6章日期和时间——新的API187
6.0引言.187
6.1查看当天日期190
6.2日期和时间的格式化.191
6.3日期/时间、YMDHMS和纪元秒(EpochSeconds)之间的转换193
6.4将字符串解析为日期.194
6.5两个日期之间的差.195
6.6日期或日历的加减.196
6.7与传统日期和日历类的接口197
第7章结构化数据.199
7.0引言.199
7.1使用数组200
7.2调整数组长度201
7.3集合框架203
7.4动态数组列表204
7.5使用泛型集合207
7.6使用泛型避免强制类型转换208
7.7迭代器的使用方式.211
7.8使用Set避免元素重复存储213
7.9使用迭代器或枚举.215
7.10链表结构216
7.11使用Hashtable和HashMap进行映射.219
7.12Properties类和Preferences类221
7.13对集合排序225
7.14避免频繁排序229
7.15在集合中查找对象.231
7.16将集合转换为数组.233
7.17自定义迭代器234
7.18堆栈.237
7.19多维结构240
7.20程序:运行时间比较242
第8章面向对象技术245
8.0引言.245
8.1使用toString()格式化对象并输出247
8.2覆盖equals()和hashCode()方法249
8.3使用关闭钩子清理程序.254
8.4使用内部类256
8.5通过接口提供回调.257
8.6多态性/抽象方法.260
8.7传递数值262
8.8使用类型安全的枚举.265
8.9Singleton模式269
8.10自定义异常271
8.11使用依赖注入272
8.12程序:绘图仪275
第9章函数式编程技术:函数接口、流、并行集合279
9.0引言.279
9.1使用lambda/Closure替代内部类281
9.2使用lambda预定义接口.284
9.3使用流.287
9.4使用并行流与集合提高吞吐量288
9.5创建自己的函数式接口.289
9.6函数引用292
9.7JavaMixins:方法混合.296
第10章输入与输出.298
10.0引言.298
10.1从标准输入设备读取数据301
10.2从控制台或控制终端读取数据,隐藏读取密码303
10.3向标准输出或标准错误流写数据305
10.4使用Formatter和printf输出.307
10.5使用StreamTokenizer的扫描输入.310
10.6使用Scanner类扫描输入315
10.7使用语法结构扫描输入.318
10.8按文件名打开文件.319
10.9复制文件320
10.10把文件读入一个字符串.326
10.11重新分配标准流.327
10.12复制一个流328
10.13读/写不同的字符集331
10.14行结束符332
10.15平台相关的文件编码.332
10.16阅读“连续”行.334
10.17读/写二进制数据338
10.18在文件中定位338
10.19处理C程序写的数据流.340
10.20存储和还原Java对象342
10.21防止ClassCastExceptions异常345
10.22读写JRA或Zip文档347
10.23利用getResource()和getResourceAsStream()获得文件.350
10.24读写压缩文件352
10.25了解串行和并行端口的通信API353
10.26将用户数据保存到磁盘.357
10.27程序:将文本输出为PostScript格式361
第11章目录和文件系统操作364
11.0引言.364
11.1获取文件信息364
11.2创建一个文件367
11.3重命名一个文件.368
11.4删除一个文件369
11.5创建临时文件370
11.6改变文件属性372
11.7列出目录内容373
11.8获取根目录375
11.9创建新的目录377
11.10使用路径而不是文件.377
11.11使用FileWatcher服务得到文件变化的通知.379
11.12程序:Find.381
第12章媒体:图形、音频、视频.384
12.0引言.384
12.1使用Graphics对象画图385
12.2无需编写主函数显示图形组件386
12.3绘制文本387
12.4在组件中央绘制文本.388
12.5绘制阴影389
12.6绘制2D(二维)文本391
12.7使用应用程序字体绘制文本394
12.8绘制图像396
12.9使用javax.imageio读写图像399
12.10播放音频/语音文件401
12.11播放视频文件.402
12.12在Java中打印407
12.13程序:PlotterAWT.410
12.14程序:Grapher.412
第13章网络客户端.416
13.0引言.416
13.1访问服务器418
13.2查找和报告网络地址.419
13.3处理网络错误421
13.4读写文本数据422
13.5读写二进制数据.424
13.6读写串行化数据.427
13.7UDP数据报428
13.8程序:TFTP的UDP客户端431
13.9URI、URL,还是URN?435
13.10轻量级Web服务客户端436
13.11SOAPWeb服务客户端.438
13.12程序:Telnet客户端.442
13.13程序:聊天客户端.444
13.14程序:简单的HTTP链接检查器448
第14章图形用户界面.450
14.0引言.450
14.1显示GUI(图形用户界面)组件.451
14.2在事件调度线程上运行GUI.453
14.3设计一个窗口布局.454
14.4选项卡视图457
14.5事件处理:使按钮工作.458
14.6使用匿名内部类进行事件处理460
14.7使用Lambdas的事件处理.461
14.8用“窗口关闭”来终止程序462
14.9对话框.467
14.10捕捉和格式化GUI异常469
14.11在窗口上打印.472
14.12使用JSpinner选择一个值.478
14.13用JFileChoose选择一个文件479
14.14选择一种颜色481
14.15用HTML格式化jcomponents484
14.16将主窗口居中显示.485
14.17改变Swing程序的外观和感觉488
14.18改进MACOSX下的SwingGUI492
14.19使用JavaFX构建GUI应用程序.494
14.20程序:定制字体选择器.496
14.21程序:定制AWT/Swing布局管理器500
第15章国际化和本地化508
15.0引言.508
15.1用I18N资源创建一个按钮.509
15.2列出可用的语言环境.511
15.3使用I18N资源创建菜单.512
15.4编写国际化的方便子程序512
15.5使用I18N资源创建一个对话框514
15.6创建一个资源包.516
15.7从代码中提取字符串.517
15.8使用特定的语言环境.518
15.9设置默认语言环境.519
15.10使用MessageFormat格式化消息520
15.11程序:MenuIntl522
15.12程序:BusCard.524
第16章Java服务器端.528
16.0引言.528
16.1打开服务器套接字.529
16.2返回一个响应(字符串或二进制).531
16.3通过网络连接返回对象信息534
16.4处理多个客户端.535
16.5为HTTP协议服务.540
16.6用SSL和JSSE保护Web服务器.542
16.7网络日志545
16.8使用SLF4J进行网络日志记录.546
16.9使用log4j进行网络日志记录.548
16.10使用java.util.logging进行网络日志记录551
16.11查找网络接口.553
16.12程序:一个Java聊天服务器.554
第17章Java和电子邮箱560
17.0引言.560
17.1发送电子邮件:浏览器版本561
17.2发送电子邮件:真实的.564
17.3启用服务器程序的邮件发送567
17.4发送MIME邮件.572
17.5提供邮件设置575
17.6阅读电子邮件576
17.7程序:MailReaderBean580
17.8程序:MailClient.584
第18章数据库访问.594
18.0引言594
18.1用JPA或Hibernate轻松访问数据库596
18.2JDBC设置和连接.601
18.3连接JDBC数据库.604
18.4发送一个JDBC查询并获取结果607
18.5使用JDBC准备好的语句610
18.6在JDBC中使用存储过程614
18.7使用ResultSet修改数据614
18.8在RowSet中存储615
18.9使用SQL更新数据.617
18.10查找JDBC元数据.619
18.11程序:SQLRunner.623
第19章处理JSON数据.636
19.0引言.636
19.1直接生成JSON638
19.2使用Jackson解析和编写JSON.639
19.3用org.json解析和编写JSON640
第20章处理XML643
20.0引言.643
20.1用JAXB在对象与XML之间转换.646
20.2使用序列化实现对象与XML之间的转换648
20.3通过XSLT转换XML649
20.4用SAX解析XML652
20.5用DOM解析XML.654
20.6用XPath查找XML元素658
20.7用Schema或DTD验证结构659
20.8用DOM和XML转换器生成自己的XML.662
20.9程序xml2mif664
第21章包和打包667
21.0引言.667
21.1创建一个封装包.668
21.2用Javadoc为类写文档669
21.3超出Javadoc:注解/元数据.673
21.4用jar归档.675
21.5从一个JAR运行一个程序676
21.6将一个类作为JavaBean678
21.7将Bean放入一个JAR中681
21.8打包一个Servlet到WAR文件.683
21.9编写一次,随处安装.684
21.10编写一次,在MacOSX上进行安装.684
21.11JavaWebStart686
21.12签名你的JAR文件692
第22章Java线程694
22.0引言.694
22.1在不同线程中运行代码.696
22.2用动画显示运动图像.700
22.3停止一个线程704
22.4交会和超时707
22.5用synchronized关键字实现线程同步.708
22.6使用锁简化同步.714
22.7用wait()和notifyAll()同步线程718
22.8使用队列接口简化生产者/消费者模式723
22.9用Fork/Join优化并行处理725
22.10在编辑器的后台保存.729
22.11程序:多线程网络服务器730
22.12使用ConcurrencyUtilities简化服务器.736
第23章反射或“命名类的类”739
23.0引言.739
23.1获取类描述符740
23.2查找并使用方法和域.741
23.3通过反射访问私有的方法和域744
23.4动态加载并实例化一个类746
23.5通过一个ClassLoader从头开始构造一个类.748
23.6性能计时749
23.7输出类的信息753
23.8显示包中包含的类清单.755
23.9使用和定义注解.757
23.10通过注解找到类似插件的类762
23.11程序:CrossRef.764
23.12程序:AppletViewer766
第24章Java和其他语言的结合773
24.0引言.773
24.1在Java中运行外部程序774
24.2运行一个程序并捕捉其输出778
24.3通过javax.script调用其他语言.781
24.4启动自己的脚本引擎.783精彩书摘
封面介绍 《Java经典实例(第三版)》的封面动物是一只家养的鸡(高卢鸡)。家养鸡是印度野生红丛林家禽的后裔,在越南和泰国地区经历了8000年的驯化。人们养鸡的目的是得到鸡肉和鸡蛋,公鸡也用于斗鸡活动(尽管斗鸡目前在许多地方是非法活动)。 这些“鸟”有着大而肥硕的身躯和娇小的翅膀,使得它们适于生活在地面,只能飞很短的距离。它们的四趾脚爪用来在泥土中刨食,从中寻找它们的美味:虫子、种子和各种植物残渣。 雄性鸡称为雄鸡或公鸡,雌性鸡称为母鸡。从鸡蛋孵化出小鸡需要三周的时间。刚孵出的小鸡就很早熟,即它们有毛茸茸的羽毛,从蛋壳里出来后就能行走。它们也不依赖妈妈喂它们食物,不仅能自己觅食,而且孵出后,依靠仍留在它们腹部的蛋黄可以维持一周的营养。 关于鸡的话题在古代作品中经常出现。中文文献最早的记录是公元前1400年,古巴比伦关于鸡的雕刻则在公元前600年,阿里斯托芬在公元前400年就有关于鸡的记载。公鸡长期以来象征着勇气,罗马人认为鸡是神圣的火星、战神,法兰西共和国选择了“公鸡”作为其象征。 ……前言/序言
前言 关于第三版 Java8是Java社区的新伙伴。Java7是对以前版本的重大改进。自《Java经典实例(第三版)》上一版出版以来,Java已发生了太多的变化!Java5中出现的新功能如注解、泛型类型、并发机制等已普遍存在了。在Java的整个画面中,API来了又走:JavaME已经过时很久了,BlackBerry已经放弃了它;在部分企业级Java中,JSF正在(慢慢)替代JSP;Spring框架继续扩大其覆盖面。许多人似乎认为桌面Java已经死亡,甚至整个Java正在逐步灭亡,但它肯定还没离开舞台;Swing、JavaFX、Java企业版以及(尽管Oracle有重大诉讼案件)Android正在使Java语言保持活力。此外,在其他“JVM语言”方面出现了更新的关注,如Groovy、JRuby、Jython、Scala和Clojure正在使Java平台处于世界的开发前沿。 实际上,第三版的主要挑战在于缩短对流行的API的介绍,保持自己应有的特色并尽量避免有偏见,使《Java经典实例(第三版)》符合由O’Reilly手册系列和之前版本所确定的厚度约束。因此,《Java经典实例(第三版)》不得不保留900多页,这当然不是我努力适应“所有亮点”的结果。 我还去掉了前一版本中的一些API介绍。最明显的是在介绍串口和并口的一章(在第10章中将有关内容消减为一节);电脑一般不使用这些了,几乎也没有人使用它们了:大家的注意力都转移到了USB口,而Java目前似乎还没有一个标准的API(坦率地讲,对此,开发者之间的真正兴趣也不大)。 关于之前版本 如果你了解一点Java的话,那很好。如果你了解更多Java编程的话,那就更好了!如果你了解一些Java知识,还想进一步深入学习,那么,《Java经典实例(第三版)》是你的理想选择。如果你对Java一点都不了解,你应当选择一本更基础的书,如果你是新手,选择《HeadFirstJava》(O’Reilly),如果你是有经验的C程序员,请选择《LearningJava》(O’Reilly)。 我是1980年在Toronto大学工作时开始使用C语言编程的,在20世纪80年代到90年代期间,C语言为我提供了很好的服务。1995年,随着新生语言Oak更名为Java,我碰到了好运,我的同事J.GregDavidson告诉我有关Java的情况。我向Greg提供的地址发送了一封电子邮件,并在1995年3月收到了来自Java发明者JamesGosling的回复,邮件内容如下: |Hi.AfriendtoldmeaboutWebRunner(?),yourextensiblenetwork |browser.ItandOak(?)itsextensionlanguage,soundedneat.Can |youpleasetellmeifit'savailableforplayyet,and/orifany |papersonitareavailableforFTP? Checkouthttp://java.sun.com (oakgotrenamedtojavaandwebrunnergotrenamedto hotjavatokeepthelawyershappy) 因此,在我开始使用之前,Oak已经变成了Java注1。我下载了HotJava,并尝试使用它。开始我并不太相信这个新奇的语言,它看起来像错位的C/C++。我编写了测试和演示程序,并将其放入javasrc目录下,以使它们与我的C源代码相互独立(因为程序经常会重名)。随着我对Java了解得越多,我开始看到它用于许多工作中的优势,比如,自动内存回收(“垃圾回收”)以及指针运算符的去除。javasrc目录下的文件在持续增加。我编写了一本Java教程“LearningTree”注2,目录下的文件增长得更快了,为此,我不得不创建子目录,尽管如此,查找东西还是越来越困难,显然,对文档的需求就变得迫切了。 在某种意义上,《Java经典实例(第三版)》是源自我的javasrc目录和为另一种新语言所建立的文档框架的高速碰撞的结果。在O’Reilly公司出版的《PerlCookbook》一书中,TomChristiansen和NathanTorkington通过他们成功的设计,将当时较新的Perl语言材料以一个个称为“实例”的精短的文章展示给大家。这样一《Java经典实例(第三版)》最初的模型当然来自人们熟悉的厨房食谱。将“cookbook”术语用于列举与计算机相关的操作技巧已有很长的历史。 在软件方面,DonaldKnuth用“cookbook”来比喻他的书《TheArtofComputerProgramming》(Addison-Wesley),该书于1968年首印。在硬件方面,DonLancaster编写了《TheTTLCookbook》一书(Sams)。(Transistor-transistorlogic,TTL,是当时电子电路的小规模构建块)。Tom和Nathan在这方面做得很成功,我想向希望学习更多Perl语言的人们推荐这《Java经典实例(第三版)》。实际上,《Java经典实例(第三版)》正是为那些想深入学习Java的人们而编写的。 每节中的代码都是高度独立的,在你的项目中可随意使用其中的代码。代码的发布符合Berkeley风格的版权,以打击成批的盗版行为。 读者对象 我假定你有一些Java基础。在《Java经典实例(第三版)》中不会告诉你怎样使用println同时输出一个字符串和一个数字,或怎样编写一个对JFrame扩展的类并将你的名字输出到窗口中。我假设你已经学习过Java课程或看过一本入门类的书籍,如《HeadFirstJava》、《LearningJava》或《JavainaNutshell》(O’Reilly)。然而,第1章介绍了一些你可能了解不深的技术,掌握它们对理解后面的内容是非常必要的。请尽管跳着阅读《Java经典实例(第三版)》!书的打印版和电子版都有大量的相互交叉引用。 《Java经典实例(第三版)》内容 与我的Perl同事Tom和Nathan不同,我不需要在语言的古怪和习语方面花费太多时间。Java是一种简洁明了的语言,没有太多的怪异之处注3。但这并不是说学好Java是件轻松的事!如果是的话,《Java经典实例(第三版)》的出版将没有必要了。我的主要精力是集中在JavaAPI上。我将通过例子教你了解重要的API是什么,它们擅长用于哪些方面。 像Perl一样,Java也是一种伴随你成长的语言。我承认我目前大部分时间都在使用Java。以前用C语言编写的程序除了其中用于设备驱动和遗留系统的之外,我现在都用Java实现了。 不过,Java比Perl更适合不同范围的任务。Perl(和其他脚本语言,如awk和Python)尤其适用“one-liner”(一句话)式的应用任务。正如Tom和Nathan所说,Perl擅长像从文件中打印第42行这样的事情。Java当然也能实现,但它似乎更适合“大型应用的开发”或企业应用的开发,因为它是可编译的面向对象的语言。实际上,在Java2中添加的大部分API都是为了实现这种类型的开发。不过,我将以较短的例子甚至是代码片段来对这些技术进行必要的说明。我会确保你看到的每个代码片段都能编译并运行。 《Java经典实例(第三版)》中较长的例子是我最初编写的一些将日常工作自动化的工具,例如,MkIndex工具(见javasrc库)可在我的Java例子源代码所在位置读取顶层目录,并为这个顶层目录构建一个浏览器能打开的index.html文件。另一个例子就是《Java经典实例(第三版)》第一版的主体部分可用XML标记(见20章)。我使用XML格式输入《Java经典实例(第三版)》部分章节的内容,并给这些初始文本加上标记,然后就可用XmlForm程序将文本转换为出版软件要求的格式。这个程序还能完成从javasrc目录插入书的手稿的全部和部分代码。XmlForm的讨论见20章。 《Java经典实例(第三版)》内容结构 让我们看看《Java经典实例(第三版)》的内容结构。第1章入门:编译、运行和调试Java程序,描述了在不同平台上编译程序、在不同环境中运行(浏览器、命令行、窗口桌面)和调试的一些方法。 第2章与运行环境交互,从编译转向运行程序,以使其适应周围的环境,周围环境是指在你的电脑中运行的其他程序。接下来的几章处理基本的API。 第3章字符串,主要阐述Java中基本但很强大的数据类型,显示了怎样合并、分离、比较和重新排列文本。 第4章正则表达式的模式匹配,教你如何使用UNIX的强大的正则表达式实现字符串匹配和模式匹配。“Regex”处理成为Java标准已有多年历史了,但如果你不知道怎么使用它,你可以“重塑轮胎”。 第5章数字,同时介绍了内置的数字类型如int和double,以及对应的API类(Integer,Double等)及其类型转换。还简单提了“大数”类。由于Java程序员经常以本地化和国际化形式处理日期和时间,第6章日期和时间——新的API,涵盖了这一重要话题。 接下来的两章介绍了数据处理部分。与大多数语言中的一样,Java中的数组是由相似类型的对象构成的线性的索引集合,见第7章结构化数据。本章还继续介绍了许多集合类的使用,这是一种存储大量java.util包中对象的强有力的方式,包括使用“Java泛型”。 尽管Java在语法上与过程式语言,如C有些相似,但Java核心是面向对象的编程语言(OOP)。第8章面向对象技术,讨论了一些适用于Java的OOP的关键概念,包括常见的java.lang.Object的覆盖方法和设计模式这一重要问题。 Java不是而且永远也不会是纯“函数编程”(FP)语言。不过,它可能使用FP的一些观点,而且在Java8及其对lambda表达式(又名“闭包”)的支持下会越来越多地使用。参见第9章函数编程技术:函数接口、流、并行集合。 接下来的几章介绍传统的输入和输出。第10章输入输出,讲读取和写入文件的规则(如果你觉得文件比较繁琐,请不要跳过这一章,因为这是后面两章的基础。你需要在本章介绍的串口或并口,以及在第13章网络客户端中讲的一个基于套接字的网络连接上读/写数据)。第11章目录和文件系统运算符,展示了文件以外的任何操作,例如识别它们的大小以及最后更新时间,还介绍了如何读取和修改目录、如何创建临时文件,以及重命名磁盘上的文件。 第12章媒体:图形、视频、音频,将我们带进GUI的开发中。这一章内容是底层细节(如绘制图形及设置字体和颜色)和非常高级的活动(如控制视频剪辑或电影)的混合。第14章图形用户接口中,介绍了GUI的高级话题,如按钮、标签、菜单等类似的GUI预定义组件的使用。一旦有了GUI程序(实际上,在你真正写它之前),你会想读第15章国际化和本地化的内容,这样在阿克巴、阿富汗、阿尔及尔、阿姆斯特丹和英格兰运行你的程序将和在阿尔伯塔、阿肯色州、阿拉巴马州等地运行结果一样。 因为Java一开始就被标榜为“Internet上的编程语言”,所以应该在《Java经典实例(第三版)》中花费一些时间讨论Java的网络编程。第13章网络客户端,涵盖了客户端网络编程的基础,主要集中在套接字技术上。在《Java经典实例(第三版)》第三版第13章网络客户端中已重新从Applet和Web客户端转向强调Web服务的客户端。今天,有许多应用程序需要访问Web服务,主要是RESTful服务,而这似乎是必要的。然后我们将转向服务器端,见第16章Java服务器端,在这一章中,你将学到一些服务器端的编程技术。 网络编程常常需要生成或处理电子邮件,第17章对此话题做了介绍。 第18章数据库访问,涵盖了高级数据库访问(JPA和Hibernate)和低级Java数据库连接(JDBC)的要点,展示了怎样连接本地或远程关系数据库、怎样存储和检索数据,以及怎样找到查询结果集或数据库中的信息。 用于数据交换的一个简单的基于文本的表示是JSON,即JavaScriptObjectNotation(JavaScript对象符号)。第19章处理JSON数据,描述了格式以及处理格式的一些API。 另一种用于存储和交换数据的文本形式是XML。第20章处理XML,讨论了XML格式及在用SAX和DOM这两种标准JavaAPI进行解析时使用的运算符。 第21章包和打包,展示了怎样创建一起使用的类的包。本章还讨论了怎样发布或分发并安装你的软件。 第22章Java线程,告诉你怎样编写一次执行多个任务的类,并利用强大的多线程硬件的优势。 第23章反射或命名类的类,向你揭示如何编写API的交叉参考文档(在你的有生之年成为Java书籍的作者!),以及Web服务器怎样能装载任意旧的Servlet(以前从未看到过特定的类)并运行它。 有时你已经有现成的代码,该代码使用另一种语言编写,且能为你实现一部分工作,或者你想用Java作为一个更大包的一部分。第24章Java和其他语言的结合,展示了怎样运行外部程序(已编译或脚本程序)以及怎样直接与C/C++或其他语言编写的本地码交互。 我不可能在一本八百多页的书中讲述Java的全部内容,后记中是一些结语和指向我的在线JavaAPI总结的链接,每个Java开发者都应该了解这些内容。 最后,附录A按照发布时间线给出了Java颇具故事性的历史,不论你学过Java的哪一版本,你都可以跳到这里,很快赶上。 没有两个程序员或作者能在展示所有Java话题的最佳顺序上达成一致。为帮助你更好地学习,我在书中建立了额外的交叉引用,大多数引用的是章节号。 平台说明 Java经历了许多版本的变迁,见附录A。《Java经典实例(第三版)》主要针对Java7和Java8平台。在《Java经典实例(第三版)》出版前,我期望所有开发中的Java项目都使用Java6或Java7,只有几个地方由于历史原因与早期版本有关(注意Java6在本版出版前约一年时间已处于“生命尽头”状态)。 我已在几种操作系统组合下和多个Java版本下对javasrc归档中的代码进行了编译,以测试这一代码的可移植性。 JavaAPI由两部分组成:核心API和非核心API。根据定义,核心API包含在JDK中,你可以免费从Java网站(http://java.com/)下载。非核心API是其余部分。但即使是这个核心部分,却一点也不小,它将近50个包,3000多个公有类,平均每个类有12个左右的方法。只调用核心API的程序可以在任何标准Java平台上运行。 Java非核心API进一步可分为标准扩展部分和非标准扩展部分。所有标准扩展API的包名都以javax开始。但请注意,并不是所有以javax命名的包都是扩展API:javax.swing及其子包SwingGUI包以前是扩展API,但现在是核心API的一部分。实现每个标准扩展API并不需要Java的许可(如Apple或IBM公司),但如果需要,就应坚持使用标准扩展的接口。《Java经典实例(第三版)》中依赖于标准扩展API的代码都会引起你的注意,除了在书中所列举的代码外,几乎很少的代码是依赖于非标准扩展的。我自己的包com.darwinsys包含一些在这里或那里用得着的实用类,在使用这个包中的类时,你会看到在文件顶部有一条导入语句。 此外,另两个平台JavaME和JavaEE也是标准定义的平台。Java微版(JavaME)用于小型设备如手持设备、移动电话、传真机等。在JavaME内,有针对不同设备类的各种“描述”。相对的,Java企业版(JavaEE)则用于构建大型可扩展的分布式应用。 Servlets、JavaServerPages、JavaServerFaces、CORBA、RMI、JavaMail、EnterpriseJavaBeans(EJBs)、Transactions以及其他的API都是JavaEE的一部分。JavaME和JavaEE包名通常以“javax”开始,因为它们不是核心包。《Java经典实例(第三版)》中没有讨论这些内容, 但包含了几个EEAPI可用于客户端程序,如JavaMail。如前所述,第一版中的Servlets和JSP在本版中已移除,因为现在有《JavaServletandJSPCookbook》(http://shop.oreilly.com/product/9780596005726.do)一书专门讨论它们。 谈到手机和移动设备,你可能知道Android系统使用了Java作为其编程语言。对Java开发者而言,值得欣慰的是,Android系统也使用了大多数核心JavaAPI,而Swing和AWT除外,因为Android系统对此提供了Android特定的替代品。那些想学习Android的Java开发者可以参阅《AndroidCookbook》(http://shop.oreilly.com/product/0636920010241.do)一书或该书的网站。