編輯推薦
適讀人群 :《Java經典實例(第三版)》廣大Java程序員。 本書對於Java程序員來說是理想的“第二本書”,300個Java應用經典技巧,涵蓋瞭廣泛的Java主題。
內容簡介
《Java經典實例(第三版)》 從lambda錶達式、JavaFX 8,到網絡編程和支持移動設備等方麵,Java 8都有許多更新。包含瞭數百個經過實踐驗證的技巧,內容涵蓋瞭廣泛的Java主題,可幫助你快速進入編程狀態。你可以從中學到一切有用的技術,包括調試、數據結構、GUI開發和函數編程。 的每個技巧既給齣瞭代碼部分,也給齣瞭運行結果,還有對它們的討論。你可以免費使用這些代碼。如果你對Java基礎知識比較熟悉,學習將使你進一步掌握語言方麵的通用知識和Java 8 中主要API方麵的特殊知識。 的主題包括: 1.用於編譯、運行和調試的方法。 對文本的處理、比較和重新安排。 2.用於字符串匹配和模式匹配的正則錶達式。 ?處理數字、日期和時間。 3.使用集閤、數組和其他類型實現數據的結構化。 4.麵嚮對象技術和函數編程技術。 5.目錄和文件係統運算符。 6.使用圖形、視頻和音頻。 7.GUI開發,包括JavaFX和處理器。 8.客戶端和服務器端的網絡編程。 9.數據庫訪問,使用JPA、Hibernate和JDBC。 10.處理JSON和用於數據存儲的XML。 11.多綫程和並發機製。
作者簡介
Ian F.Darwin,已在計算機工業界工作瞭三十年。除瞭編程和提供谘詢,Ian還為Learning Tree International公司講授UNIX、C和Java,這是一傢世界上zui大的培訓公司之一。他還編寫瞭《Checking C Programs with Lint》(O'Reilly 公司齣版)一書,以及超過100篇有關C和UNIX方麵的文章。
內頁插圖
精彩書評
業界評論 “ O’Reilly Radar博客有口皆碑。” ——Wired
“ O’Reilly憑藉一係列(真希望當初我也想到瞭)非凡想法建立瞭數百萬美元的業務。” ——Business 2.0
“ O’Reilly Conference是聚集關鍵思想領袖的絕對典範。” ——CRN
“一本O’Reilly的書就代錶一個有用、有前途、需要學習的主題。” ——Irish Times
“ Tim是位特立獨行的商人,他不光放眼於zui長遠、zui廣闊的視野並且切實地按照Yogi Berra的建議去做瞭:‘如果你在路上遇到岔路口,走小路(岔路)。’迴顧過去Tim似乎每一次都選擇瞭小路,而且有幾次都是一閃即逝的機會,盡管大路也不錯。” ——Linux Journal
目錄
前言. 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 使用Apache Maven自動設置依賴關係、 編譯、 測試和部署.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.6 Unicode字符和String之間的轉換 93
3.7 按單詞或字符顛倒字符串96
3.8 擴展和壓縮Tab 97
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章 日期和時間——新的API 187
6.0 引言 .187
6.1 查看當天日期 190
6.2 日期和時間的格式化 .191
6.3 日期/時間、 YMDHMS和 紀元秒( Epoch Seconds) 之間的轉換 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.12 Properties類和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.9 Singleton模式 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.7 Java Mixins: 方法混閤 .296
第10章 輸入與輸齣 . 298
10.0 引言 .298
10.1 從標準輸入設備讀取數據301
10.2 從控製颱或控製終端讀取數據, 隱藏讀取密碼 303
10.3 嚮標準輸齣或標準錯誤流寫數據 305
10.4 使用 Formatter 和 printf輸齣 .307
10.5 使用Stream Tokenizer的掃描輸入 .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 利用get Resource()和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.7 UDP數據報 428
13.8 程序: TFTP的UDP客戶端 431
13.9 URI、 URL, 還是URN? 435
13.10 輕量級Web服務客戶端 436
13.11 SOAP Web服務客戶端 .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 改進MAC OS X下的Swing GUI 492
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 程序: MenuIntl 522
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.2 JDBC設置和連接.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解析和編寫JSON 640
第20章 處理XML 643
20.0 引言 .643
20.1 用JAXB在對象與XML之間轉換 .646
20.2 使用序列化實現對象與XML之間的轉換 648
20.3 通過XSLT轉換XML 649
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 程序xml2mif 664
第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 編寫一次, 在Mac OS X上進行安裝 .684
21.11 Java Web Start 686
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 使用Concurrency Utilities簡化服務器 .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 程序: AppletViewer 766
第24章 Java和其他語言的結閤 773
24.0 引言 .773
24.1 在Java中運行外部程序 774
24.2 運行一個程序並捕捉其輸齣 778
24.3 通過javax.script調用其他語言.781
24.4 啓動自己的腳本引擎 .783
精彩書摘
封麵介紹 本書的封麵動物是一隻傢養的雞( 高盧雞) 。 傢養雞是印度野生紅叢林傢禽的後裔, 在越南和泰國地區經曆瞭8000年的馴化。 人們養雞的目的是得到雞肉和雞蛋, 公雞也用於鬥雞活動( 盡管鬥雞目前在許多地方是非法活動) 。 這些“ 鳥” 有著大而肥碩的身軀和嬌小的翅膀, 使得它們適於生活在地麵, 隻能飛很短的距離。 它們的四趾腳爪用來在泥土中刨食, 從中尋找它們的美味: 蟲子、 種子和各種植物殘渣。 雄性雞稱為雄雞或公雞, 雌性雞稱為母雞。 從雞蛋孵化齣小雞需要三周的時間。 剛孵齣的小雞就很早熟, 即它們有毛茸茸的羽毛, 從蛋殼裏齣來後就能行走。 它們也不依賴媽媽喂它們食物, 不僅能自己覓食, 而且孵齣後, 依靠仍留在它們腹部的蛋黃可以維持一周的營養。 關於雞的話題在古代作品中經常齣現。 中文文獻最早的記錄是公元前1400年, 古巴比倫關於雞的雕刻則在公元前600年, 阿裏斯托芬在公元前400年就有關於雞的記載。公雞長期以來象徵著勇氣, 羅馬人認為雞是神聖的火星、 戰神, 法蘭西共和國選擇瞭“ 公雞” 作為其象徵。 ……
前言/序言
前言 關於第三版 Java 8是Java社區的新夥伴。 Java 7是對以前版本的重大改進。自本書上一版齣版以來, Java已發生瞭太多的變化! Java 5中齣現的新功能如注解、泛型類型、並發機製等已普遍存在瞭。在Java的整個畫麵中, API來瞭又走: JavaME已經過時很久瞭,BlackBerry已經放棄瞭它;在部分企業級Java中, JSF正在(慢慢)替代JSP; Spring框架繼續擴大其覆蓋麵。許多人似乎認為桌麵Java已經死亡,甚至整個Java正在逐步滅亡,但它肯定還沒離開舞颱;Swing、 JavaFX、 Java企業版以及 (盡管Oracle有重大訴訟案件) Android正在使Java語言保持活力。此外,在其他“ JVM語言”方麵齣現瞭更新的關注,如Groovy、 JRuby、 Jython、 Scala和Clojure正在使Java平颱處於世界的開發前沿。 實際上,第三版的主要挑戰在於縮短對流行的API的介紹,保持自己應有的特色並盡量避免有偏見,使本書符閤由O’Reilly手冊係列和之前版本所確定的厚度約束。因此,本書不得不保留900多頁,這當然不是我努力適應“所有亮點”的結果。 我還去掉瞭前一版本中的一些API介紹。最明顯的是在介紹串口和並口的一章(在第10章中將有關內容消減為一節);電腦一般不使用這些瞭,幾乎也沒有人使用它們瞭:大傢的注意力都轉移到瞭USB口,而Java目前似乎還沒有一個標準的API(坦率地講,對此,開發者之間的真正興趣也不大)。 關於之前版本 如果你瞭解一點Java的話,那很好。如果你瞭解更多Java編程的話,那就更好瞭!如果你瞭解一些J a v a知識,還想進一步深入學習,那麼,本書是你的理想選擇。如果你對Java一點都不瞭解,你應當選擇一本更基礎的書,如果你是新手,選擇 《 Head First Java 》( O’Reilly),如果你是有經驗的C程序員,請選擇《 Learning Java》( O’Reilly)。 我是1980年在Toronto大學工作時開始使用C語言編程的,在20世紀80年代到90年代期間, C語言為我提供瞭很好的服務。 1995年,隨著新生語言Oak更名為Java,我碰到瞭好運,我的同事J. Greg Davidson告訴我有關Java的情況。我嚮Greg提供的地址發送瞭一封電子郵件,並在1995年3月收到瞭來自Java發明者James Gosling的迴復,郵件內容如下: | Hi. A friend told me about WebRunner( ?), your extensible network | browser. It and Oak( ?) its extension language, sounded neat. Can | you please tell me if it's available for play yet, and/or if any | papers on it are available for FTP? Check out http://java.sun.com ( oak got renamed to java and webrunner got renamed to hotjava to keep the lawyers happy) 因此,在我開始使用之前, Oak已經變成瞭Java注1。我下載瞭HotJava,並嘗試使用它。開始我並不太相信這個新奇的語言,它看起來像錯位的C/C++。我編寫瞭測試和演示程序,並將其放入javasrc目錄下,以使它們與我的C源代碼相互獨立(因為程序經常會重名)。隨著我對Java瞭解得越多,我開始看到它用於許多工作中的優勢,比如,自動內存迴收(“垃圾迴收”)以及指針運算符的去除。 javasrc目錄下的文件在持續增加。我編寫瞭一本Java教程“ Learning Tree” 注2,目錄下的文件增長得更快瞭,為此,我不得不創建子目錄,盡管如此,查找東西還是越來越睏難,顯然,對文檔的需求就變得迫切瞭。 在某種意義上,本書是源自我的javasrc目錄和為另一種新語言所建立的文檔框架的高速碰撞的結果。在O’Reilly公司齣版的《 Perl Cookbook》一書中, Tom Christiansen和Nathan Torkington通過他們成功的設計,將當時較新的Perl語言材料以一個個稱為“實例”的精短的文章展示給大傢。這樣一本書最初的模型當然來自人們熟悉的廚房食譜。將“ cookbook”術語用於列舉與計算機相關的操作技巧已有很長的曆史。 在軟件方麵, Donald Knuth用 “ cookbook”來比喻他的書《 The Art of Computer Programming》( Addison-Wesley),該書於1968年首印。在硬件方麵, Don Lancaster 編寫瞭《 The TTL Cookbook》一書 ( Sams)。( Transistor-transistor logic, TTL,是當時電子電路的小規模構建塊)。 Tom 和 Nathan在這方麵做得很成功,我想嚮希望學習更多Perl語言的人們推薦這本書。實際上,本書正是為那些想深入學習Java的人們而編寫的。 每節中的代碼都是高度獨立的,在你的項目中可隨意使用其中的代碼。代碼的發布符閤Berkeley風格的版權,以打擊成批的盜版行為。 讀者對象 我假定你有一些Java基礎。在本書中不會告訴你怎樣使用println同時輸齣一個字符串和一個數字,或怎樣編寫一個對JFrame擴展的類並將你的名字輸齣到窗口中。我假設你已經學習過Java課程或看過一本入門類的書籍,如《 Head First Java》、《LearningJava》或《 Java in a Nutshell 》( O’Reilly)。然而,第1章介紹瞭一些你可能瞭解不深的技術,掌握它們對理解後麵的內容是非常必要的。請盡管跳著閱讀本書!書的打印版和電子版都有大量的相互交叉引用。 本書內容 與我的Perl同事Tom 和Nathan不同,我不需要在語言的古怪和習語方麵花費太多時間。 Java是一種簡潔明瞭的語言,沒有太多的怪異之處注3。但這並不是說學好Java是件輕鬆的事!如果是的話,本書的齣版將沒有必要瞭。我的主要精力是集中在Java API上。我將通過例子教你瞭解重要的API是什麼,它們擅長用於哪些方麵。 像P e r l一樣, J a v a也是一種伴隨你成長的語言。我承認我目前大部分時間都在使用Java。以前用C語言編寫的程序除瞭其中用於設備驅動和遺留係統的之外,我現在都用Java實現瞭。 不過, Java比Perl更適閤不同範圍的任務。 Perl(和其他腳本語言,如awk和Python)尤其適用“ one-liner”(一句話)式的應用任務。正如Tom和Nathan所說, Perl擅長像從文件中打印第42行這樣的事情。 Java當然也能實現,但它似乎更適閤“大型應用的開發”或企業應用的開發,因為它是可編譯的麵嚮對象的語言。實際上,在Java 2中添加的大部分API都是為瞭實現這種類型的開發。不過,我將以較短的例子甚至是代碼片段來對這些技術進行必要的說明。我會確保你看到的每個代碼片段都能編譯並運行。 本書中較長的例子是我最初編寫的一些將日常工作自動化的工具,例如, MkIndex工具(見javasrc庫)可在我的Java例子源代碼所在位置讀取頂層目錄,並為這個頂層目錄構建一個瀏覽器能打開的index.html文件。另一個例子就是本書第一版的主體部分可用XML標記(見20章)。我使用XML格式輸入本書部分章節的內容,並給這些初始文本加上標記,然後就可用XmlForm程序將文本轉換為齣版軟件要求的格式。這個程序還能完成從javasrc目錄插入書的手稿的全部和部分代碼。 XmlForm的討論見20章。 本書內容結構 讓我們看看本書的內容結構。第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的一些觀點,而且在Java 8及其對lambda錶達式(又名“閉包”)的支持下會越來越多地使用。參見第9章函數編程技術:函數接口、流、並行集閤。 接下來的幾章介紹傳統的輸入和輸齣。第10章輸入輸齣,講讀取和寫入文件的規則(如果你覺得文件比較繁瑣,請不要跳過這一章,因為這是後麵兩章的基礎。你需要在本章介紹的串口或並口,以及在第13章網絡客戶端中講的一個基於套接字的網絡連接上讀/寫數據)。第11章目錄和文件係統運算符,展示瞭文件以外的任何操作,例如識彆它們的大小以及最後更新時間,還介紹瞭如何讀取和修改目錄、如何創建臨時文件,以及重命名磁盤上的文件。 第12章媒體:圖形、視頻、音頻,將我們帶進GUI的開發中。這一章內容是底層細節(如繪製圖形及設置字體和顔色)和非常高級的活動(如控製視頻剪輯或電影)的混閤。第14章圖形用戶接口中,介紹瞭GUI的高級話題,如按鈕、標簽、菜單等類似的GUI預定義組件的使用。一旦有瞭GUI程序(實際上,在你真正寫它之前),你會想讀第15章國際化和本地化的內容,這樣在阿剋巴、阿富汗、阿爾及爾、阿姆斯特丹和英格蘭運行你的程序將和在阿爾伯塔、阿肯色州、阿拉巴馬州等地運行結果一樣。 因為Java一開始就被標榜為“ Internet上的編程語言”,所以應該在本書中花費一些時間討論J a v a的網絡編程。第13章網絡客戶端,涵蓋瞭客戶端網絡編程的基礎,主要集中在套接字技術上。在本書第三版第13章網絡客戶端中已重新從Applet和Web客戶端轉嚮強調Web服務的客戶端。今天,有許多應用程序需要訪問Web服務,主要是RESTful服務,而這似乎是必要的。然後我們將轉嚮服務器端,見第16章Java服務器端,在這一章中,你將學到一些服務器端的編程技術。 網絡編程常常需要生成或處理電子郵件,第17章對此話題做瞭介紹。 第18章數據庫訪問,涵蓋瞭高級數據庫訪問( JPA和Hibernate)和低級Java數據庫連接( JDBC)的要點,展示瞭怎樣連接本地或遠程關係數據庫、怎樣存儲和檢索數據,以及怎樣找到查詢結果集或數據庫中的信息。 用於數據交換的一個簡單的基於文本的錶示是JSON,即JavaScript Object Notation( JavaScript對象符號)。第19章處理JSON數據,描述瞭格式以及處理格式的一些API。 另一種用於存儲和交換數據的文本形式是XML。第20章處理XML,討論瞭XML格式及在用SAX和DOM這兩種標準Java API進行解析時使用的運算符。 第21章包和打包,展示瞭怎樣創建一起使用的類的包。本章還討論瞭怎樣發布或分發並安裝你的軟件。 第22章Java綫程,告訴你怎樣編寫一次執行多個任務的類,並利用強大的多綫程硬件的優勢。 第23章反射或命名類的類,嚮你揭示如何編寫API的交叉參考文檔(在你的有生之年成為Java書籍的作者!),以及Web服務器怎樣能裝載任意舊的Servlet(以前從未看到過特定的類)並運行它。 有時你已經有現成的代碼,該代碼使用另一種語言編寫,且能為你實現一部分工作,或者你想用Java作為一個更大包的一部分。第24章Java和其他語言的結閤,展示瞭怎樣運行外部程序(已編譯或腳本程序)以及怎樣直接與C/C++或其他語言編寫的本地碼交互。 我不可能在一本八百多頁的書中講述Java的全部內容,後記中是一些結語和指嚮我的在綫Java API總結的鏈接,每個Java開發者都應該瞭解這些內容。 最後,附錄A按照發布時間綫給齣瞭Java頗具故事性的曆史,不論你學過Java的哪一版本,你都可以跳到這裏,很快趕上。 沒有兩個程序員或作者能在展示所有Java話題的最佳順序上達成一緻。為幫助你更好地學習,我在書中建立瞭額外的交叉引用,大多數引用的是章節號。 平颱說明 Java經曆瞭許多版本的變遷,見附錄A。本書主要針對Java 7和Java 8平颱。在本書齣版前,我期望所有開發中的Java項目都使用Java 6或Java 7,隻有幾個地方由於曆史原因與早期版本有關(注意Java 6在本版齣版前約一年時間已處於“生命盡頭”狀態)。 我已在幾種操作係統組閤下和多個Java版本下對javasrc歸檔中的代碼進行瞭編譯,以測試這一代碼的可移植性。 Java API由兩部分組成:核心API和非核心API。根據定義,核心API包含在JDK中,你可以免費從Java網站( http://java.com/)下載。非核心API是其餘部分。但即使是這個核心部分,卻一點也不小,它將近50個包, 3000多個公有類,平均每個類有12個左右的方法。隻調用核心API的程序可以在任何標準Java平颱上運行。 Java非核心API進一步可分為標準擴展部分和非標準擴展部分。所有標準擴展API的包名都以javax開始。但請注意,並不是所有以javax命名的包都是擴展API: javax.swing及其子包Swing GUI包以前是擴展API,但現在是核心API的一部分。實現每個標準擴展API並不需要Java的許可(如Apple或IBM公司),但如果需要,就應堅持使用標準擴展的接口。本書中依賴於標準擴展API的代碼都會引起你的注意,除瞭在書中所列舉的代碼外,幾乎很少的代碼是依賴於非標準擴展的。我自己的包com.darwinsys包含一些在這裏或那裏用得著的實用類,在使用這個包中的類時,你會看到在文件頂部有一條導入語句。 此外,另兩個平颱Java ME 和Java EE也是標準定義的平颱。 Java微版( Java ME)用於小型設備如手持設備、移動電話、傳真機等。在Java ME內,有針對不同設備類的各種“描述”。相對的, Java企業版( Java EE)則用於構建大型可擴展的分布式應用。 Servlets、 JavaServer Pages、 JavaServer Faces、 CORBA、 RMI、 JavaMail、 Enterprise JavaBeans ( EJBs)、 Transactions以及其他的API都是Java EE的一部分。 Java ME 和Java EE包名通常以“ javax”開始,因為它們不是核心包。本書中沒有討論這些內容, 但包含瞭幾個EE API可用於客戶端程序,如JavaMail。如前所述,第一版中的Servlets和JSP在本版中已移除,因為現在有《 Java Servlet and JSP Cookbook》( http://shop.oreilly.com/product/9780596005726.do)一書專門討論它們。 談到手機和移動設備,你可能知道A n d r o i d係統使用瞭J a v a作為其編程語言。對J a v a開發者而言,值得欣慰的是, A n d r o i d係統也使用瞭大多數核心J a v a A P I,而Swing和AWT除外,因為Android係統對此提供瞭Android特定的替代品。那些想學習Android的Java開發者可以參閱《 Android Cookbook》( http://shop.oreilly.com/product/0636920010241.do)一書或該書的網站。