① java經典教材
隨著JAVA行業日益的發展,高薪資也吸引到各行各業的從業者。下面就推薦幾本JAVA經典教材供大家參考:
1. 《Java經典實例》收集了Java開發人員經常遇到的成百個問題的解決方案,涵蓋了Java應用的方方面面,堪稱講述Java應用的網路全書。
2. 《Java 實時編程》主要講述使用Java RTS進行Java實時編程的各類主題。主要內容包括3個部分:第一部分"實時計算概念",明確定義計算領域中的實時概念,並討論了許多實時應用程序設計和開發的理論;第二部分"高級Java RTS",提供充足的示例代碼來說明Java RTS的內部運作機制及其使用;第三部分"使用Java RTS",討論了實際的案例研究。
3. 《Java網路編程精解》,通過這本書讀者不僅可以掌握網路編程的實用技術,還可以進一步提高按照面向對象的思想來設計和編寫Java軟體的能力。
② java socket網路編程
//==============Server.java=================//
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(12345);
System.out.println("伺服器就緒,請啟動客戶端.");
Socket so = s.accept();
byte[] buff = new byte[1024];
int read = so.getInputStream().read(buff);
String[] abc=new String(buff,0,read).split("\\D+");
int a = Integer.parseInt(abc[0]);
int b = Integer.parseInt(abc[1]);
int c = Integer.parseInt(abc[2]);
if(!cbt(a,b,c))
so.getOutputStream().write("輸入的數據無法組成三角形.".getBytes());
else
so.getOutputStream().write(getArea(a,b,c).getBytes());
so.getOutputStream().flush();
so.close();
s.close();
}
private static String getArea(int a, int b, int c) {
float s = (a+b+c)/2f;
return "面積: "+Math.sqrt(s*(s-a)*(s-b)*(s-c));
}
private static boolean cbt(int a, int b, int c) {
return a>0&&b>0&&c>0&&a+b>c&&b+c>a&&a+c>b;
}
}
//=================Client.java======================//
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("輸入三角形的三邊並用逗號隔開,如: (3,4,5) ");
byte[] buff=new byte[64];
int r = System.in.read(buff);
String ipaddr = "localhost";//根據情況改變,在本機調試就不改了
Socket so = new Socket(ipaddr,12345);
so.getOutputStream().write(new String(buff,0,r).getBytes());
r = so.getInputStream().read(buff);
so.close();
String rs = new String(buff,0,r);
System.out.println(rs);
}
}
//先啟動Server,再啟動Client
③ Java網路編程從入門到精通(4):DNS緩存
在通過DNS查找域名的過程中 可能會經過多台中間DNS伺服器才能找到指定的域名 因此 在DNS伺服器上查找域名是非常昂貴的操作 在Java中為了緩解這個問題 提供了DNS緩存 當InetAddress類第一次使用某個域名(如)創建InetAddress對象後 JVM就會將這個域名和它從DNS上獲得的信息(如IP地址)都保存在DNS緩存中 當下一次InetAddress類再使用這個域名時 就直接從DNS緩存里獲得所需的信息 而無需再訪問DNS伺服器
DNS緩存在默認時將永遠保留曾經訪問過的域名信息 但我們可以修改這個默認值 一般有兩種方法可以修改這個默認值
在程序中通過java security Security setProperty方法設置安全屬性nel的值(單位 秒) 如下面的代碼將緩存超時設為 秒
java security Security setProperty( nel );
設置java security文件中的neorkaddresl屬性 假設JDK的安裝目錄是C jdk 那麼java security文件位於c jdk jrelibsecurity目錄中 打開這個文件 找到nel屬性 並將這個屬性值設為相應的緩存超時(單位 秒)
如果將nel屬性值設為 那麼DNS緩存數據將永遠不會釋放 下面的代碼演示了使用和不使用DNS緩存所產生效果
package mynet;import *;publicclass MyDNS{publicstaticvoidmain(String[]args)throwsException{//args[ ]:本機名args[ ] 緩沖時間if(args length< )return;java security Security setProperty( nel args[ ]);longtime=System currentTimeMillis();InetAddressaddresses []=InetAddress getAllByName(args[ ]);System out println( addresses : +String valueOf(System currentTimeMillis() time)+ 毫秒 );for(InetAddressaddress:addresses )System out println(address);System out print( 按任意鍵繼續 );System in read();time=System currentTimeMillis();InetAddressaddresses []=InetAddress getAllByName(args[ ]);System out println( addresses : +String valueOf(System currentTimeMillis() time)+ 毫秒 );for(InetAddressaddress:addresses )System out println(address);}}
在上面的代碼中設置了DNS緩存超時(通過args[ ]參數) 用戶可以通過命令行參數將這個值傳入MyDNS中 這個程序首先使用getAllByName建立一個InetAddress數組 然後通過System in read使程序暫停 當用戶等待一段時間後 可以按任意鍵繼續 並使用同一個域名(args[ ])再建立一個InetAddress數組 如果用戶等待的這段時間比DNS緩存超時小 那麼無論情況如何變化 addresses 和addresses 數組中的元素是一樣的 並且創建addresses 數組所花費的時間一般為 毫秒(小於 毫秒後 Java無法獲得更精確的時間)
測試
執行如下命令(將DNS緩存超時設為 秒)
java mynet MyDNS
運行結果 (在 秒之內按任意鍵)
addresses : 毫秒/ 按任意鍵繼續addresses : 毫秒/
運行結果 (在 秒後按任意鍵)
addresses : 毫秒/ 按任意鍵繼續addresses : 毫秒/
在上面的測試中可能出現兩個運行結果 如果在出現 按任意鍵繼續… 後 在 秒之內按任意鍵繼續後 就會得到運行結果 從這個結果可以看出 addresses 所用的時間為 毫秒 也就是說 addresses 並未真正訪問DNS伺服器 而是直接從內存中的DNS緩存得到的數據 當在 秒後按任意鍵繼續後 就會得到運行結果 這時 內存中的DNS緩存中的數據已經釋放 所以addresses 還得再訪問DNS伺服器 因此 addresses 的時間是 毫秒(addresses 和addresses 後面的毫秒數可能在不同的環境下的值不一樣 但一般情況下 運行結果 的addresses 的值為 或是一個接近 的數 如 運行結果 的addresses 的值一般會和addresses 的值很接近 或是一個遠比 大的數 如 )
測試
執行如下命令(ComputerName為本機的計算機名 DNS緩存超時設為永不過期[ ])
java mynet MyDNS ComputerName
運行結果(按任意鍵繼續之前 將 刪除)
addresses : 毫秒myuniverse/ myuniverse/ 按任意鍵繼續addresses : 毫秒myuniverse/ myuniverse/
從上面的測試可以看出 將DNS緩存設為永不過期後 無論過多少時間 按任意鍵後 addresses 任然得到了兩個IP地址( 和 ) 而且addresses 的時間是 毫秒 但在這時 已經被刪除 因此可以判斷 addresses 是從DNS緩存中得到的數據 如果運行如下的命令 並在 秒後按任意鍵繼續後 addresses 就會只剩下一個IP地址( )
java mynet MyDNS ComputerName
如果域名在DNS伺服器上不存在 那麼客戶端在進行一段時間的嘗試後(平均為 秒) 就會拋出一個UnknownHostException異常 為了讓下一次訪問這個域名時不再等待 DNS緩存將這個錯誤信息也保存了起來 也就是說 只有第一次訪問錯誤域名時才進行 稱左右的嘗試 以後再訪問這個域名時將直接拋出UnknownHostException異常 而無需再等待 秒鍾
訪問域名失敗的原因可能是這個域名真的不存在 也可能是因為DNS伺服器或是其他的硬體或軟體的臨時故障 因此 一般不能將這個域名錯誤信息一直保留 在Java中可以通過neorkaddresl屬性設置保留這些信息的時間 這個屬性的默認值是 秒 它也可以通過java security Security setProperty方法或java security文件來設置 下面的代碼演示了neorkaddresl屬性的用法
package mynet;import *;publicclass MyDNS {publicstaticvoidmain(String[]args)throwsException{java security Security setProperty( neorkaddresl );longtime= ;try{time=System currentTimeMillis();InetAddress getByName( );}catch(Exceptione){System out println( 不存在!address : +String valueOf(System currentTimeMillis() time)+ 毫秒 );}//Thread sleep( );//延遲 秒try{time=System currentTimeMillis();InetAddress getByName( );}catch(Exceptione){System out println( 不存在!address : +String valueOf(System currentTimeMillis() time)+ 毫秒 );}}}
在上面的代碼中將neorkaddresl屬性值設為 秒 這個程序分別測試了address 和address 訪問(這是個不存在的域名 讀者可以將其換成任何不存在的域名)後 用了多長時間拋出UnknownHostException異常
運行結果
不存在!address : 毫秒不存在!address : 毫秒
我們從上面的運行結果可以看出 address 使用了 毫秒就拋出了異常 因此 可以斷定address 是從DNS緩存里獲得了域名不可訪問的信息 所以就直接拋出了UnknowHostException異常 如果將上面代碼中的延遲代碼的注釋去掉 那麼可能得到如下的運行結果
不存在!address : 毫秒不存在!address : 毫秒
從上面的運行結果可以看出 在第 秒時 DNS緩存中的數據已經被釋放 因此 address 仍需要訪問DNS伺服器才能知道是不可訪問的域名
在使用DNS緩存時有兩點需要注意
可以根據實際情況來設置nel屬性的值 一般將這個屬性的值設為 但如果訪問的是動態映射的域名(如使用動態域名服務將域名映射成ADSL的動態IP) 就可能產生IP地址變化後 客戶端得到的還是原來的IP地址的情況
lishixin/Article/program/Java/hx/201311/11147
④ GitHub上面有哪些經典的java框架源碼
Bazel:來自Google的構建工具,可以快速、可靠地構建代碼。官網
Gradle:使用Groovy(非XML)進行增量構建,可以很好地與Maven依賴管理配合工作。官網
Buck:Facebook構建工具。官網
位元組碼操作
編程方式操作位元組碼的開發庫。
ASM:通用底層位元組碼操作和分析開發庫。官網
Byte Buddy:使用流式API進一步簡化位元組碼生成。官網
Byteman:在運行時通過DSL(規則)操作位元組碼進行測試和故障排除。官網
Javassist:一個簡化位元組碼編輯嘗試。官網
集群管理
在集群內動態管理應用程序的框架。
Apache Aurora:Apache Aurora是一個Mesos框架,用於長時間運行服務和定時任務(cron job)。官網
Singularity:Singularity是一個Mesos框架,方便部署和操作。它支持Web Service、後台運行、調度作業和一次性任務。官網
代碼分析
測量代碼指標和質量工具。
Checkstyle:代碼編寫規范和標准靜態分析工具。官網
Error Prone:將常見編程錯誤作為運行時錯誤報告。官網
FindBugs:通過位元組碼靜態分析查找隱藏bug。官網
jQAssistant:使用基於Neo4J查詢語言進行代碼靜態分析。官網
PMD:對源代碼分析查找不良的編程習慣。官網
SonarQube:通過插件集成其它分析組件,對過去一段時間內的數據進行統計。官網
編譯器生成工具
用來創建解析器、解釋器或編譯器的框架。
ANTLR:復雜的全功能自頂向下解析框架。官網
JavaCC:JavaCC是更加專門的輕量級工具,易於上手且支持語法超前預測。官網
外部配置工具
支持外部配置的開發庫。
config:針對JVM語言的配置庫。官網
owner:減少冗餘配置屬性。官網
約束滿足問題求解程序
幫助解決約束滿足問題的開發庫。
Choco:可直接使用的約束滿足問題求解程序,使用了約束規劃技術。官網
JaCoP:為FlatZinc語言提供了一個介面,可以執行MiniZinc模型。官網
OptaPlanner:企業規劃與資源調度優化求解程序。官網
Sat4J:邏輯代數與優化問題最先進的求解程序。官網
持續集成
Bamboo:Atlassian解決方案,可以很好地集成Atlassian的其他產品。可以選擇開源許可,也可以購買商業版。官網
CircleCI:提供託管服務,可以免費試用。官網
Codeship:提供託管服務,提供有限的免費模式。官網
fabric8:容器集成平台。官網
Go:ThoughtWork開源解決方案。官網
Jenkins:支持基於伺服器的部署服務。官網
TeamCity:JetBrain的持續集成解決方案,有免費版。官網
Travis:通常用作開源項目的託管服務。官網
Buildkite: 持續集成工具,用簡單的腳本就能設置pipeline,而且能快速構建,可以免費試用。官網
CSV解析
簡化CSV數據讀寫的框架與開發庫
uniVocity-parsers:速度最快功能最全的CSV開發庫之一,同時支持TSV與固定寬度記錄的讀寫。官網
資料庫
簡化資料庫交互的相關工具。
Apache Phoenix:HBase針對低延時應用程序的高性能關系資料庫層。官網
Crate:實現了數據同步、分片、縮放、復制的分布式數據存儲。除此之外還可以使用基於SQL的語法跨集群查詢。官網
Flyway:簡單的資料庫遷移工具。官網
H2:小型SQL資料庫,以可以作為內存資料庫使用著稱。官網
HikariCP:高性能JDBC連接工具。官網
JDBI:便捷的JDBC抽象。官網
Protobuf:Google數據交換格式。官網
SBE:簡單二進制編碼,是最快速的消息格式之一。官網
Wire:整潔輕量級協議緩存。官網
幫實現依賴翻轉範式的開發庫。官網
Apache DeltaSpike:CDI擴展框架。官網
Dagger2:編譯時注入框架,不需要使用反射。官網
Guice:可以匹敵Dagger的輕量級注入框架。官網
HK2:輕量級動態依賴注入框架。官網
開發流程增強工具
從最基本的層面增強開發流程。
ADT4J:針對代數數據類型的JSR-269代碼生成器。官網
AspectJ:面向切面編程(AOP)的無縫擴展。官網
Auto:源代碼生成器集合。官網
DCEVM:通過修改JVM在運行時支持對已載入的類進行無限次重定義。官網
HotswapAgent:支持無限次重定義運行時類與資源。官網
Immutables:類似Scala的條件類。官網
JHipster:基於Spring Boot與AngularJS應用程序的Yeoman源代碼生成器。官網
JRebel:無需重新部署,可以即時重新載入代碼與配置的商業軟體。官網
Lombok:減少冗餘的代碼生成器。官網
Spring Loaded:類重載代理。官網
vert.x:多語言事件驅動應用框架。官網
分布式應用
用來編寫分布式容錯應用的開發庫和框架。
Akka:用來編寫分布式容錯並發事件驅動應用程序的工具和運行時。官網
Apache Storm:實時計算系統。官網
Apache ZooKeeper:針對大型分布式系統的協調服務,支持分布式配置、同步和名稱注冊。官網
Hazelcast:高可擴展內存數據網格。官網
Hystrix:提供延遲和容錯。官網
JGroups:提供可靠的消息傳遞和集群創建的工具。官網
Orbit:支持虛擬角色(Actor),在傳統角色的基礎上增加了另外一層抽象。官網
Quasar:為JVM提供輕量級線程和角色。官網
分布式資料庫
對應用程序而言,在分布式系統中的資料庫看起來就像是只有一個數據源。
Apache Cassandra:列式資料庫,可用性高且沒有單點故障。官網
Apache HBase:針對大數據的Hadoop資料庫。官網
Druid:實時和歷史OLAP數據存儲,在聚集查詢和近似查詢方面表現不俗。官網
Infinispan:針對緩存的高並發鍵值對數據存儲。官網
發布
以本機格式發布應用程序的工具。
Bintray:發布二進制文件版本控制工具。可以於Maven或Gradle一起配合使用。提供開源免費版本和幾種商業收費版本。官網
Central Repository:最大的二進制組件倉庫,面向開源社區提供免費服務。Apache Maven默認使用Central官網Repository,也可以在所有其他構建工具中使用。
IzPack:為跨平台部署建立創作工具(Authoring Tool)。官網
JitPack:打包GitHub倉庫的便捷工具。可根據需要構建Maven、Gradle項目,發布可立即使用的組件。官網
Launch4j:將JAR包裝為輕量級本機Windows可執行程序。官網
Nexus:支持代理和緩存功能的二進制管理工具。官網
packr:將JAR、資源和JVM打包成Windows、Linux和Mac OS X本地發布文件。官網
文檔處理工具
處理Office文檔的開發庫。
Apache POI:支持OOXML規范(XLSX、DOCX、PPTX)以及OLE2規范(XLS、DOC、PPT)。官網
documents4j:使用第三方轉換器進行文檔格式轉換,轉成類似MS Word這樣的格式。官網
jOpenDocument:處理OpenDocument格式(由Sun公司提出基於XML的文檔格式)。官網
函數式編程
函數式編程支持庫。
Cyclops:支持一元(Monad)操作和流操作工具類、comprehension(List語法)、模式匹配、trampoline等特性。官網
Fugue:Guava的函數式編程擴展。官網
Functional Java:實現了多種基礎和高級編程抽象,用來輔助面向組合開發(composition-oriented development)。官網
Javaslang:一個函數式組件庫,提供持久化數據類型和函數式控制結構。官網
jOOλ:旨在填補Java 8 lambda差距的擴展,提供了眾多缺失的類型和一組豐富的順序流API。官網
游戲開發
游戲開發框架。
jMonkeyEngine:現代3D游戲開發引擎。官網
libGDX:全面的跨平台高級框架。官網
LWJGL:對OpenGL/CL/AL等技術進行抽象的健壯框架。官網
GUI
現代圖形化用戶界面開發庫。
JavaFX:Swing的後繼者。官網
Scene Builder:開發JavaFX應用的可視化布局工具。官網
高性能計算
涵蓋了從集合到特定開發庫的高性能計算相關工具。
Agrona:高性能應用中常見的數據結構和工具方法。官網
Disruptor:線程間消息傳遞開發庫。官網
fastutil:快速緊湊的特定類型集合(Collection)。官網
GS Collections:受Smalltalk啟發的集合框架。官網
HPPC:基礎類型集合。官網
Javolution:實時和嵌入式系統的開發庫。官網
JCTools:JDK中缺失的並發工具。官網
Koloboke:Hash set和hash map。官網
Trove:基礎類型集合。官網
High-scale-bli:Cliff Click 個人開發的高性能並發庫官網
IDE
簡化開發的集成開發環境。
Eclipse:老牌開源項目,支持多種插件和編程語言。官網
IntelliJ IDEA:支持眾多JVM語言,是安卓開發者好的選擇。商業版主要針對企業客戶。官網
NetBeans:為多種技術提供集成化支持,包括Java SE、Java EE、資料庫訪問、HTML5
Imgscalr:純Java 2D實現,簡單、高效、支持硬體加速的圖像縮放開發庫。官網
Picasso:安卓圖片下載和圖片緩存開發庫。官網
Thumbnailator:Thumbnailator是一個高質量Java縮略圖開發庫。官網
ZXing:支持多種格式的一維、二維條形碼圖片處理開發庫。官網
im4java: 基於ImageMagick或GraphicsMagick命令行的圖片處理開發庫,基本上ImageMagick能夠支持的圖片格式和處理方式都能夠處理。官網
Apache Batik:在Java應用中程序以SVG格式顯示、生成及處理圖像的工具集,包括SVG解析器、SVG生成器、SVG DOM等模塊,可以集成使用也可以單獨使用,還可以擴展自定義的SVG標簽。官網
JSON
簡化JSON處理的開發庫。
Genson:強大且易於使用的Java到JSON轉換開發庫。官網
Gson:谷歌官方推出的JSON處理庫,支持在對象與JSON之間雙向序列化,性能良好且可以實時調用。官網
Jackson:與GSON類似,在頻繁使用時性能更佳。官網
LoganSquare:基於Jackson流式API,提供對JSON解析和序列化。比GSON與Jackson組合方式效果更好。官網
Fastjson:一個Java語言編寫的高性能功能完善的JSON庫。官網
Kyro:快速、高效、自動化的Java對象序列化和克隆庫。官網
JVM與JDK
目前的JVM和JDK實現。
JDK 9:JDK 9的早期訪問版本。官網
OpenJDK:JDK開源實現。官網
基於JVM的語言
除Java外,可以用來編寫JVM應用程序的編程語言。
Scala:融合了面向對象和函數式編程思想的靜態類型編程語言。官網
Groovy:類型可選(Optionally typed)的動態語言,支持靜態類型和靜態編譯。目前是一個Apache孵化器項目。官網
Clojure:可看做現代版Lisp的動態類型語言。官網
Ceylon:RedHat開發的面向對象靜態類型編程語言。官網
Kotlin:JetBrain針對JVM、安卓和瀏覽器提供的靜態類型編程語言。官網
Xtend:一種靜態編程語言,能夠將其代碼轉換為簡潔高效的Java代碼,並基於JVM運行。官網
日誌
記錄應用程序行為日誌的開發庫。
Apache Log4j 2:使用強大的插件和配置架構進行完全重寫。官網
kibana:分析及可視化日誌文件。官網
Logback:強健的日期開發庫,通過Groovy提供很多有趣的選項。官網
logstash:日誌文件管理工具。官網
Metrics:通過JMX或HTTP發布參數,並且支持存儲到資料庫。官網
SLF4J:日誌抽象層,需要與具體的實現配合使用。官網
機器學習
提供具體統計演算法的工具。其演算法可從數據中學習。
Apache Flink:快速、可靠的大規模數據處理引擎。官網
Apache Hadoop:在商用硬體集群上用來進行大規模數據存儲的開源軟體框架。官網
Apache Mahout:專注協同過濾、聚類和分類的可擴展演算法。官網
Apache Spark:開源數據分析集群計算框架。官網
DeepDive:從非結構化數據建立結構化信息並集成到已有資料庫的工具。官網
Deeplearning4j:分布式多線程深度學習開發庫。官網
H2O:用作大數據統計的分析引擎。官網
Weka:用作數據挖掘的演算法集合,包括從預處理到可視化的各個層次。官網
QuickML:高效機器學習庫。官網、GitHub
消息傳遞
在客戶端之間進行消息傳遞,確保協議獨立性的工具。
Aeron:高效可擴展的單播、多播消息傳遞工具。官網
Apache ActiveMQ:實現JMS的開源消息代理(broker),可將同步通訊轉為非同步通訊。官網
Apache Camel:通過企業級整合模式(Enterprise Integration Pattern EIP)將不同的消息傳輸API整合在一起。官網
Apache Kafka:高吞吐量分布式消息系統。官網
Hermes:快速、可靠的消息代理(Broker),基於Kafka構建。官網
JBoss HornetQ:清晰、准確、模塊化,可以方便嵌入的消息工具。官網
JeroMQ:ZeroMQ的純Java實現。官網
Smack:跨平台XMPP客戶端函數庫。官網
Openfire:是開源的、基於XMPP、採用Java編程語言開發的實時協作伺服器。 Openfire安裝和使用都非常簡單,並可利用Web界面進行管理。官網GitHub
Spark:是一個開源,跨平台IM客戶端。它的特性支持集組聊天,電話集成和強大安全性能。如果企業內部部署IM使用Openfire+Spark是最佳的組合。官網GitHub
Tigase: 是一個輕量級的可伸縮的 Jabber/XMPP 伺服器。無需其他第三方庫支持,可以處理非常高的復雜和大量的用戶數,可以根據需要進行水平擴展。官網
雜項
未分類其它資源。
Design Patterns:實現並解釋了最常見的設計模式。官網
Jimfs:內存文件系統。官網
Lanterna:類似curses的簡單console文本GUI函數庫。官網
LightAdmin:可插入式CRUD UI函數庫,可用來快速應用開發。官網
OpenRefine:用來處理混亂數據的工具,包括清理、轉換、使用Web Service進行擴展並將其關聯到資料庫。官網
RoboVM:Java編寫原生iOS應用。官網
Quartz:強大的任務調度庫.官網
應用監控工具
監控生產環境中應用程序的工具。
AppDynamics:性能監測商業工具。官網
JavaMelody:性能監測和分析工具。官網
Kamon:Kamon用來監測在JVM上運行的應用程序。官網
New Relic:性能監測商業工具。官網
SPM:支持對JVM應用程序進行分布式事務追蹤的性能監測商業工具。官網
Takipi:產品運行時錯誤監測及調試商業工具。官網
原生開發庫
用來進行特定平台開發的原生開發庫。
JNA:不使用JNI就可以使用原生開發庫。此外,還為常見系統函數提供了介面。官網
自然語言處理
用來專門處理文本的函數庫。
Apache OpenNLP:處理類似分詞等常見任務的工具。官網
CoreNLP:斯坦佛CoreNLP提供了一組基礎工具,可以處理類似標簽、實體名識別和情感分析這樣的任務。官網
LingPipe:一組可以處理各種任務的工具集,支持POS標簽、情感分析等。官網
Mallet:統計學自然語言處理、文檔分類、聚類、主題建模等。官網
網路
網路編程函數庫。
Async Http Client:非同步HTTP和WebSocket客戶端函數庫。官網
Grizzly:NIO框架,在Glassfish中作為網路層使用。官網
Netty:構建高性能網路應用程序開發框架。官網
OkHttp:一個Android和Java應用的HTTP+SPDY客戶端。官網
Undertow:基於NIO實現了阻塞和非阻塞API的Web伺服器,在WildFly中作為網路層使用。官網
ORM
處理對象持久化的API。
Ebean:支持快速數據訪問和編碼的ORM框架。官網
EclipseLink:支持許多持久化標准,JPA、JAXB、JCA和SDO。官網
Hibernate:廣泛使用、強健的持久化框架。Hibernate的技術社區非常活躍。官網
MyBatis:帶有存儲過程或者SQL語句的耦合對象(Couples object)。官網
OrmLite:輕量級開發包,免除了其它ORM產品中的復雜性和開銷。官網
Nutz:另一個SSH。官網,Github
JFinal:JAVA WEB + ORM框架。官網,Github
用來幫助創建PDF文件的資源。
Apache FOP:從XSL-FO創建PDF。官網
Apache PDFBox:用來創建和操作PDF的工具集。官網
DynamicReports:JasperReports的精簡版。官網
flyingsaucer:XML/XHTML和CSS 2.1渲染器。官網
iText:一個易於使用的PDF函數庫,用來編程創建PDF文件。注意,用於商業用途時需要許可證。官網
JasperReports:一個復雜的報表引擎。官網
性能分析
性能分析、性能剖析及基準測試工具。
jHiccup:提供平台中JVM暫停的日誌和記錄。官網
JMH:JVM基準測試工具。官網
JProfiler:商業分析器。官網
LatencyUtils:測量和報告延遲的工具。官網
VisualVM:對運行中的應用程序信息提供了可視化界面。官網
YourKit Java Profiler:商業分析器。官網
響應式開發庫
用來開發響應式應用程序的開發庫。
Reactive Streams:非同步流處理標准,支持非阻塞式反向壓力(backpressure)。官網
Reactor:構建響應式快速數據(fast-data)應用程序的開發庫。官網
RxJava:通過JVM可觀察序列(observable sequence)構建非同步和基於事件的程序。官網
REST框架
用來創建RESTful 服務的框架。
Dropwizard:偏向於自己使用的Web框架。用來構建Web應用程序,使用了Jetty、Jackson、Jersey和Metrics。官網
Feign:受Retrofit、JAXRS-2.0和WebSocket啟發的HTTP客戶端連接器(binder)。官網
Jersey:JAX-RS參考實現。官網
RESTEasy:經過JAX-RS規范完全認證的可移植實現。官網
RestExpress:一個Java類型安全的REST客戶端。官網
RestX:基於註解處理和編譯時源碼生成的框架。官網
Retrofit:類型安全的REST客戶端。官網
Spark:受到Sinatra啟發的Java REST框架。官網
Swagger:Swagger是一個規范且完整的框架,提供描述、生產、消費和可視化RESTful Web Service。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
科學計算與分析
用於科學計算和分析的函數庫。
DataMelt:用於科學計算、數據分析及數據可視化的開發環境。官網
JGraphT:支持數學圖論對象和演算法的圖形庫。官網
JScience:用來進行科學測量和單位的一組類。官網
搜索引擎
文檔索引引擎,用於搜索和分析。
Apache Solr:一個完全的企業搜索引擎。為高吞吐量通信進行了優化。官網
Elasticsearch:一個分布式、支持多租戶(multitenant)全文本搜索引擎。提供了RESTful Web介面和無schema的JSON文檔。官網
Apache Lucene:是一個開放源代碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。官網
安全
用於處理安全、認證、授權或會話管理的函數庫。
Apache Shiro:執行認證、授權、加密和會話管理。官網
Bouncy Castle,涵蓋了從基礎的幫助函數到PGP/SMIME操作。官網:多途加密開發庫。支持JCA提供者(JCA provider)
Cryptomator:在雲上進行客戶端跨平台透明加密。官網
Keycloak:為瀏覽器應用和RESTful Web Service集成SSO和IDM。目前還處於beta版本,但是看起來非常有前途。官網
PicketLink:PicketLink是一個針對Java應用進行安全和身份認證管理的大型項目(Umbrella Project)。官網
序列化
用來高效處理序列化的函數庫。
FlatBuffers:高效利用內存的序列化函數庫,無需解包和解析即可高效訪問序列化數據。官網
Kryo:快速、高效的對象圖形序列化框架。官網
FST:提供兼容JDK的高性能對象圖形序列化。官網
MessagePack:一種高效的二進制序列化格式。官網
應用伺服器
用來部署應用程序的伺服器。
Apache Tomcat:針對Servlet和JSP的應用伺服器,健壯性好且適用性強。官網
Apache TomEE:Tomcat加Java EE。官網
Jetty:輕量級、小巧的應用伺服器,通常會嵌入到項目中。官網
WebSphere Liberty:輕量級、模塊化應用伺服器,由IBM開發。官網
WildFly:之前被稱作JBoss,由Red Hat開發。支持很多Java EE功能。官網
模板引擎
在模板中替換表達式的工具。
Apache Velocity:提供HTML頁面模板、email模板和通用開源代碼生成器模板。官網
FreeMarker:通用模板引擎,不需要任何重量級或自己使用的依賴關系。官網
Handlebars.java:使用Java編寫的模板引擎,邏輯簡單,支持語義擴展(semantic Mustache)。官網
Thymeleaf:旨在替換JSP,支持XML文件的工具。官網
測試
測試內容從對象到介面,涵蓋性能測試和基準測試工具。
Apache JMeter:功能性測試和性能評測。官網
Arquillian:集成測試和功能行測試平台,集成Java EE容器。官網
AssertJ:支持流式斷言提高測試的可讀性。官網
Awaitility:用來同步非同步操作的DSL。官網
Cucumber:BDD測試框架。官網
Gatling:設計為易於使用、可維護的和高性能負載測試工具。官網
Hamcrest:可用來靈活創建意圖(intent)表達式的匹配器。官網
JMockit:用來模擬靜態、final方法等。官網
JUnit:通用測試框架。官網
Mockito:在自動化單元測試中創建測試對象,為TDD或BDD提供支持。官網
PowerMock: 支持模擬靜態方法、構造函數、final類和方法、私有方法以及移除靜態初始化器的模擬工具。官網
REST Assured:為REST/HTTP服務提供方便測試的Java DSL。官網
Selenide:為Selenium提供精準的周邊API,用來編寫穩定且可讀的UI測試。官網
Selenium:為Web應用程序提供可移植軟體測試框架。官網
Spock:JUnit-compatible framework featuring an expressive Groovy-derived specification language.官網兼容JUnit框架,支持衍生的Groovy范的語言。
TestNG:測試框架。官網
Truth:Google的斷言和命題(proposition)框架。官網
Unitils:模塊化測試函數庫,支持單元測試和集成測試。官網
WireMock:Web Service測試樁(Stub)和模擬函數。官網
通用工具庫
通用工具類函數庫。
Apache Commons:提供各種用途的函數,比如配置、驗證、集合、文件上傳或XML處理等。官網
args4j:命令行參數解析器。官網
CRaSH:為運行進行提供CLI。官網
Gephi:可視化跨平台網路圖形化操作程序。官網
Guava:集合、緩存、支持基本類型、並發函數庫、通用註解、字元串處理、I/O等。官網
JADE:構建、調試多租戶系統的框架和環境。官網
javatuples:正如名字表示的那樣,提供tuple支持。盡管目前tuple的概念還有留有爭議。官網
JCommander:命令行參數解析器。官網
Protégé:提供存在論(ontology)編輯器以及構建知識系統的框架。官網
網路爬蟲
用於分析網站內容的函數庫。
Apache Nutch:可用於生產環境的高度可擴展、可伸縮的網路爬蟲。官網
Crawler4j:簡單的輕量級網路爬蟲。官網
JSoup:刮取、解析、操作和清理HTML。官網
Web框架
用於處理Web應用程序不同層次間通訊的框架。
Apache Tapestry:基於組件的框架,使用Java創建動態、強健的、高度可擴展的Web應用程序。官網
Apache Wicket:基於組件的Web應用框架,與Tapestry類似帶有狀態顯示GUI。官網
Google Web Toolkit:一組Web開發工具集,包含在客戶端將Java代碼轉為JavaScript的編譯器、XML解析器、RCP官網API、JUnit集成、國際化支持和GUI控制項。
Grails:Groovy框架,旨在提供一個高效開發環境,使用約定而非配置、沒有XML並支持混入(mixin)。官網
Ninja:Java全棧Web開發框架。非常穩固、快速和高效。官網
Pippo:小型、高度模塊化的類Sinatra框架。官網
Play:使用約定而非配置,支持代碼熱載入並在瀏覽器中顯示錯誤。官網
PrimeFaces:JSF框架,提供免費和帶支持的商業版本。包括若干前端組件。官網
Ratpack:一組Java開發函數庫,用於構建快速、高效、可擴展且測試完備的HTTP應用程序。官網
Spring Boot:微框架,簡化了Spring新程序的開發過程。官網
Spring:旨在簡化Java EE的開發過程,提供依賴注入相關組件並支持面向切面編程。官網
Vaadin:基於GWT構建的事件驅動框架。使用服務端架構,客戶端使用Ajax。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
業務流程管理套件
流程驅動的軟體系統構建。
jBPM:非常靈活的業務流程管理框架,致力於構建開發與業務分析人員之間的橋梁。官網
Activity:輕量級工作流和業務流程管理框架。官網github
資源
社區
⑤ Java網路編程從入門到精通(33):非阻塞I/O的緩沖區(Buffer)
如果將同步I/O方式下的數據傳輸比做數據傳輸的零星方式(這里的零星是指在數據傳輸的過程中是以零星的位元組方式進行的) 那麼就可以將非阻塞I/O方式下的數據傳輸比做數據傳輸的集裝箱方式(在位元組和低層數據傳輸之間 多了一層緩沖區 因此 可以將緩沖區看做是裝載位元組的集裝箱) 大家可以想像 如果我們要運送比較少的貨物 用集裝箱好象有點不太合算 而如果要運送上百噸的貨物 用集裝箱來運送的成本會更低 在數據傳輸過程中也是一樣 如果數據量很小時 使用同步I/O方式會更適合 如果數據量很大時(一般以G為單位) 使用非阻塞I/O方式的效率會更高 因此 從理論上說 數據量越大 使用非阻塞I/O方式的單位成本就會越低 產生這種結果的原因和緩沖區的一些特性有著直接的關系 在本節中 將對緩沖區的一些主要特性進行講解 使讀者可以充分理解緩沖區的概念沖森 並能通過緩沖區來提高程序的執行效率
創建緩沖區
Java提供了七個基本的緩沖區 分別由七個類來擾判拍管理 它們都可以在java nio包中找到 這七個類如下所示
ByteBuffer
ShortBuffer
IntBuffer
CharBuffer
FloatBuffer
DoubleBuffer
LongBuffer
這七個類中的方法類似 只是它們的返回值或參數和相應的簡單類型相對應 如ByteBuffer類的get方法返回了byte類型的數據 而put方法需要一個byte類型的參數 在CharBuffer類中的get和put方法返回和傳遞的數據類型就是char 這七個類都沒有public構造方法 因此 它們不能通過new來創建相應的對象實例 這些類都可以通過兩種方式來創建相應的對象實例
通過靜態方法allocate來創建緩沖區
這七類都有一個靜態的allocate方法 通過這個方法可以創建有最大容量限制的緩沖區對象 allocate的定義如下
ByteBuffer類中的allocate方法
(intcapacity)
IntBuffer類中的allocate方法
publicstaticIntBufferallocate(intcapacity)
其他五個緩沖區類中的allocate 方法定義和上面的定義類似 只是返回值的類型是相應的緩沖區緩羨類
allocate方法有一個參數capacity 用來指定緩沖區容量的最大值 capacity的不能小於 否則會拋出一個IllegalArgumentException異常 使用allocate來創建緩沖區 並不是一下子就分配給緩沖區capacity大小的空間 而是根據緩沖區中存儲數據的情況來動態分配緩沖區的大小(實際上 在低層Java採用了數據結構中的堆來管理緩沖區的大小) 因此 這個capacity可以是一個很大的值 如 * ( M) allocate的使用方法如下
ByteBufferbyteBuffer=ByteBuffer allocate( );IntBufferintBuffer=IntBuffer allocate( );
在使用allocate創建緩沖區時應用注意 capacity的含義隨著緩沖區的不同而不同 如創建位元組緩沖區時 capacity指的是位元組數 而在創建整型(int)緩沖區時 capacity指的是int型值的數目 如果轉換成字數 capacity的值應該乘 如上面代碼中的intBuffer緩沖區最大可容納的位元組數是 * = 個
通過靜態方法wrap來創建緩沖區
使用allocate方法可以創建一個空的緩沖區 而wrap方法可以利用已經存在的數據來創建緩沖區 wrap方法可以將數組直接轉換成相應類型的緩沖區 wrap方法有兩種重載形式 它們的定義如下
ByteBuffer類中的wrap方法
publicstaticByteBufferwrap(byte[]array)publicstaticByteBufferwrap(byte[]array intoffset intlength)
IntBuffer類中的wrap方法
publicstaticIntBufferwrap(byte[]array)publicstaticIntBufferwrap(byte[]array intoffset intlength)
其他五個緩沖區類中的wrap 方法定義和上面的定義類似 只是返回值的類型是相應的緩沖區類
在wrap方法中的array參數是要轉換的數組(如果是其他的緩沖區類 數組的類型就是相應的簡單類型 如IntBuffer類中的wrap方法的array就是int[]類型) offset是要轉換的子數組的偏移量 也就是子數組在array中的開始索引 length是要轉換的子數組的長度 利用後兩個參數可以將array數組中的一部分轉換成緩沖區對象 它們的使用方法如下
byte[]myByte=newbyte[]{ };int[]myInt=newint[]{ };ByteBufferbyteBuffer=ByteBuffer wrap(myByte);IntBufferintBuffer=IntBuffer wrap(myInt );
可以通過緩沖區類的capacity方法來得到緩沖區的大小 capacity方法的定義如下
publicfinalintcapacity()
如果使用allocate方法來創建緩沖區 capacity方法的返回值就是capacity參數的值 而使用wrap方法來創建緩沖區 capacity方法的返回值是array數組的長度 但要注意 使用wrap來轉換array的字數組時 capacity的長度仍然是原數組的長度 如上面代碼中的intBuffer緩沖區的capacity值是 而不是
除了可以將數組轉換成緩沖區外 也可以通過緩沖區類的array方法將緩沖區轉換成相應類型的數組 IntBuffer類的array方法的定義方法如下(其他緩沖區類的array的定義類似)
publicfinalint[]array()
下面的代碼演示了如何使用array方法將緩沖區轉換成相應類型的數組
int[]myInt=newint[]{ };IntBufferintBuffer=IntBuffer wrap(myInt );for(intv:intBuffer array()) System out print(v+ );
在執行上面代碼後 我們發現輸出的結果是 而不是 這說明在將子數組轉換成緩沖區的過程中實際上是將整個數組轉換成了緩沖區 這就是用wrap包裝子數組後 capacity的值仍然是原數組長度的真正原因 在使用array方法時應注意 在以下兩種緩沖區中不能使用array方法
只讀的緩沖區如果使用只讀緩沖區的array方法 將會拋出一個ReadOnlyBufferException異常
使用allocateDirect方法創建的緩沖區
如果調用這種緩沖區中的array方法 將會拋出一個UnsupportedOperationException異常
可以通過緩沖區類的hasArray方法來判斷這個緩沖區是否可以使用array方法 如果返回true 則說明這個緩沖區可以使用array方法 否則 使用array方法將會拋出上述的兩種異常之一
注意 使用array方法返回的數組並不是緩沖區數據的副本 被返回的數組實際上就是緩沖區中的數據 也就是說 array方法只返回了緩沖區數據的引用 當數組中的數據被修改後 緩沖區中的數據也會被修改 返之也是如此 關於這方面內容將在下一節 讀寫緩沖區中的數據 中詳細講解
在上述的七個緩沖區類中 ByteBuffer類和CharBuffer類各自還有另外一種方法來創建緩沖區對象
● ByteBuffer類
可以通過ByteBuffer類的allocateDirect方法來創建ByteBuffer對象 allocateDirect方法的定義如下
Direct(intcapacity)
使用allocateDirect方法可以一次性分配capacity大小的連續位元組空間 通過allocateDirect方法來創建具有連續空間的ByteBuffer對象雖然可以在一定程度上提高效率 但這種方式並不是平台獨立的 也就是說 在一些操作系統平台上使用allocateDirect方法來創建ByteBuffer對象會使效率大幅度提高 而在另一些操作系統平台上 性能會表現得非常差 而且allocateDirect方法需要較長的時間來分配內存空間 在釋放空間時也較慢 因此 在使用allocateDirect方法時應謹慎
通過isDirect方法可以判斷緩沖區對象(其他的緩沖區類也有isDirect方法 因為 ByteBuffer對象可以轉換成其他的緩沖區對象 這部分內容將在後面講解)是用哪種方式創建的 如果isDirect方法返回true 則這個緩沖區對象是用allocateDirect方法創建的 否則 就是用其他方法創建的緩沖區對象
● CharBuffer類
我們可以發現 上述的七種緩沖區中並沒有字元串緩沖區 而字元串在程序中卻是最常用的一種數據類型 不過不要擔心 雖然java nio包中並未提供字元串緩沖區 但卻可以將字元串轉換成字元緩沖區(就是CharBuffer對象) 在CharBuffer類中的wrap方法除了上述的兩種重載形式外 又多了兩種重載形式 它們的定義如下
publicstaticCharBufferwrap(CharSequencecsq)publicstaticCharBufferwrap(CharSequencecsq intstart intend)
其中csq參數表示要轉換的字元串 但我們注意到csq的類型並不是String 而是CharSequence CharSequence類Java中四個可以表示字元串的類的父類 這四個類是String StringBuffer StringBuilder和CharBuffer(大家要注意 StringBuffer和本節講的緩沖區類一點關系都沒有 這個類在java lang包中) 也就是說 CharBuffer類的wrap方法可以將這四個類的對象轉換成CharBuffer對象
另外兩個參數start和end分別是子字元串的開始索引和結束索引的下一個位置 如將字元串 中的 轉換成CharBuffer對象的語句如下
CharBuffercb=CharBuffer wrap( );
下面的代碼演示了如何使用wrap方法將不同形式的字元串轉換成CharBuffer對象
lishixin/Article/program/Java/hx/201311/26505
⑥ Java網路編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域
該方法可以得到遠程主機的域名 也可以得到本機名 getHostName方法的定義如下
publicStringgetHostName()
下面是三種創建InetAddress對象的方式 在這三種方式中 getHostName返回的值是不同的
使用getLocalHost方法創建InetAddress對象
如果InetAddress對象是用getLocalHost方法創建的 getHostName返回的是本機名 如下面的代碼所示
InetAddressaddress=InetAddress getLocalHost();System out println(address getHostName());//輸出本機名
使用域名創建InetAddress對象
用域名作為getByName和getAllByName方法的參數調用這兩個方法後 系統會自動記住這個域名 當調用getHostName方法時 就無需再訪問DNS伺服器 而是直接將這個域名返回 如下面的代碼所示
InetAddressaddress=InetAddress getByName( );System out println(address getHostName());//無需訪問DNS伺服器 直接返回域名
使用IP地址創建InetAddress對象
使用IP地址創建InetAddress對象時(getByName getAllByName和getByAddress方法都可以通過IP地址創建InetAddress對象) 並不需要訪問DNS伺服器 因此 通過DNS伺服器查找域名的工作就由getHostName方法來完成 如果這個IP地址不存在或DNS伺服器不允許進行IP地址和域名的映射 getHostName方法就直接返回這個IP地址 如下面的代碼所示
InetAddressaddress=InetAddress getByName( );System out println(address getHostName());//需要訪問DNS伺服器才能得到域名InetAddressaddress=InetAddress getByName( );//IP地址不存在System out println(address getHostName());//直接返回IP地址
從上面的三種情況可以看出 只有通過使用IP地址創建的InetAddress對象調用getHostName方法時才訪問DNS伺服器 在其他情況 getHostName方法並不會訪問DNS伺服器 而是直接將域名或本機名返回 下面的代碼演示了在不同情況下如何使用getHostName方法 並計算了各種情況所需的毫秒數
package mynet;import *;publicclass DomainName{publicstaticvoidmain(String[]args)throwsException{longtime= ;//得到本機名InetAddressaddress =InetAddress getLocalHost();System out println( 本機名 +address getHostName());//直接返回域名InetAddressaddress =InetAddress getByName( );time=System currentTimeMillis();System out print( 直接得到域名 +address getHostName());System out println( 所用時間 +String valueOf(System currentTimeMillis() time)+ 毫秒 );//通過DNS查找域名InetAddressaddress =InetAddress getByName( ); System out println( address : +address );//域名為空time=System currentTimeMillis();System out print( 通過DNS查找域名 +address getHostName());System out println( 所用時間 +String valueOf(System currentTimeMillis() time)+ 毫秒 ); System out println( address : +address );//同時輸出域名和IP地址}}
運行結果
本機名 ComputerName直接得到域名 所用時間 毫秒address :/ 通過DNS查找域名 bigip o所用時間 毫秒address :bigip o/
lishixin/Article/program/Java/hx/201311/26413