爲大家推薦一款JAVA源代碼排版與優化軟件Jstyle,喜歡用VIM,記事本等簡單工具寫代碼,或者Eclipse,notepad等自帶的代碼風格無法滿足你挑剔的眼光時,又或者你拿到了一份別人在windows平臺編碼的代碼但卻在你的linux環境下無法查看其中的中文註釋時,或許這款軟件可以幫助你。
軟件是我自己本人寫的,起初只爲做個工具供自己使用,但後一些額外功能的加入,便越寫越多,同時也希望如果好的話也可以讓別人使用,最後便決定認認真真做,以後貢獻給開源社區。本心想做這麼個東西應該挺容易的,計劃10天完成的,但後來上手後才發現寫這個比以前做網站,寫其他程序都要複雜,因爲必須要熟悉java所有的關鍵字,必須要理解字符編碼這些,必須要處理好程序源代碼中的每個特殊符號,引號,註釋等等。並且以正確美觀希望的排版方式輸出來。。總之,做的過程很辛苦,整整花了16天的時間才寫完,好在還是做完了,這也是本人大學期間寫的的第四款小軟件。軟件採用java語言編寫,安裝使用都很簡單,linux,windows平臺都可以運行,需要的話我提供了附件下載。
功能簡介:
1.支持6種代碼風格,分別爲:jayson,java,linux,gnu,ak,mini.
2.支持6種輸入字符編碼,分別爲: gbk,utf-8,utf-16,utf16-le,utf16-be,big5.其中對含有BOM(這個不明白可以百度)的uncode編碼可以進行自動識別,當源文件是含有BOM的uncode編碼時,如果不指定輸入編碼,軟件將進行自動檢測(這個檢測是不能保證100%正確的,因爲火狐瀏覽器對字符編碼的檢測也不能保證100%正確,不過正確率很高,尤其當文件中含有中文字符時。所以如果源文件字符編碼比較不常見時,請
自行指定輸入編碼)。
3.支持6種輸出字符編碼,同輸入編碼。
4.其他一些有用功能,比如增加頭部註釋,刪除代碼中的空行,自動給程序中的if(),for(),while()循環當只有一條語句時增添括號等,隔開雙目運算符等等。
優點:
網上有很多優秀的代碼美化軟件,Jstyle與他們有什麼不同呢。我之前一直使用一個開源軟件Artistic Style(C++編寫,支持java,c,c++),確實很優秀,很強大,但是當它碰到
int a;int b;if(){a=0;}
這種流水賬語句時就無能爲力了,這個也就是Jstyly的不存在的問題.其實jstyle也就是Artistic Style的java縮減版,不過實現卻是一種新的思維,代碼沒有參考一句Artistic Style,而且c++我也不咋地。
缺點不足:
1.目前爲第一版本,只支持單文件處理,批量源文件同時處理不支持,這個以後會改進。
2.目前只支持java源代碼,c\c++不支持,這也是爲啥軟件名爲Jstyle.
3.因爲軟件中檢測一些java語法使用了開發者的思考模式,所以請確保源文件內不含有明顯的錯誤,比如只有一半的引號,只有一個註釋開始符“/*”而沒有結束符,出現了奇數個括號等,將可能得不到預期效果,有時甚至給出源文件存在錯誤提示,所以對於不完整的程序可能得不到預期效果。,
4.目前程序沒有進行公測,只是經我個人測試,所以可能會有BUG出現,歡迎大家及時指出。
功能詳解及用法:
軟件沒有圖形界面,採用命令行處理,基本用法如下。
linux平臺爲shell腳本,windows爲.bat腳本
Usage : jstyle [options] Source.java
jstyle [command]
分爲兩種,上面一行爲處理java源文件時的用法,jstyle+參數+源文件,第二行爲命令模式,及不處理源文件(不帶源文件),只是查看軟件有關信息,jstyle+命令。詳細情況可以使用時自行查看。
詳細功能及參數說明:
1.代碼風格:(-style=或者-s=, 默認風格爲jasyon,S5)
(1) jayson:(或者S5,兩次縮進爲一個'\t')
- public class test
- {
- public void test()
- {
- int a=0;
- if(a>0)
- {
- a=1;
- }
- }
- }
(2) java:(或者S1,兩次縮進爲一個'\t')
- public class test {
- public void test(){
- int a=0;
- if(a>0){
- a=1;
- }
- }
- }
(3) linux:(或者S4,一次縮進爲一個'\')
- public class test
- {
- public void test()
- {
- int a=0;
- if(a>0)
- {
- a=1;
- }
- }
- }
(4) gnu:(或者S2,兩次縮進爲一個'\t')
- public class test
- {
- public void test()
- {
- int a=0;
- if(a>0)
- {
- a=1;
- }
- }
- }
(5) ak:(或者S3,一次縮進爲一個'\t')
- public
- abstract class test
- {
- public
- static void test()
- {
- int a=0;
- if(a>0)
- {
- a=1;
- }
- }
- public
- static int test1()
- {
- int a=0;
- if(a>0)
- {
- a=1;
- }
- return 1;
- }
- }
(6) mini:(或者S6,兩次縮進爲一個'\t')
- public class test{
- public void test(){
- int a=0;
- if(a>0)
- {
- a=1;
- }
- }
- }
2.輸入字符編碼:
參數:-charset_in= 或者 -ci=,可取的值爲gbk,utf-8,utf-16,utf16-le,utf16-be,big5,目前只自動檢測帶BOM的uncode編碼,如果不帶BOM請自動手動指定,所以鼓勵加入BOM,並且以utf-8編碼保存源文件。
3.輸出字符編碼:
參數:-charset_out=或者 -co=,可取值同輸入字符編碼。
4.處理空白行(-aod=或者-a=).
可選值爲delete和add(或者d和a),delete表示刪除程序中的空白行,add表示在每個方法區域間增加空白行。由於程序處理是重新排版而非簡單修整,所以有時會刪除不必要的空行,這些都不是主要問題。
5.其他額外參數(--other=或者--o=,注意是以"--"開頭,不是"-"開頭,表示這個選項後面可以跟多個值,別且它們之間以冒號":"隔開):
(1) ah:給源文件增加頭部註釋說明,風格如下:
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * xxxx.java
- * @ author:
- * @ version:
- *
- * Directions:
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- */
(2) am:爲每個方法區域增加註釋,風格如下:
- /*
- *
- */
- public void run(){}
(3) dc:刪除文件中所有註釋。
(4) ra:修整數組,如下:
- int[]={1,2,3,4}
變爲
- int[]={1,
- 2,
- 3,
- 4}
- int[][]={(1,2),(3,4),(5,6)}
變爲
- int[][]={(1,2),
- (3,4),
- (5,6)}
如果不指定默認爲9個元素後自動換行。
(5) ro:修整控制塊。
- if(a>0||a>0&&a>0||a>0){
- .....
- }
變爲
- if(a>0||
- a>0||
- a>0)
- {
- ....
- }
如果不指定默認3個關係運算後換行。
(6) rs:修整switch語句。
- switch(a){
- case 1:
- a;
- case 2:
- b;
- }
變爲
- switch(a){
- case 1:
- a;
- case 2:
- b;
- }
(7) po:隔開雙目運算符與兩邊元素。
- int a,b;
- a=a+b;
變爲
- int a,b;
- a = a + b;
默認不隔開。
(8) pb:隔開{與前面的元素。
- public void run(){
變成
- public void run() {
默認不隔開。
(9) ps:隔開if,switch,for,while語句中"("與前面的元素。
- if(a>b){
- ....
- }
變爲
- if (a>b){
- ....
- }
6.其他隱含功能。
(1)軟件會對程序中所以流程跳轉語句(if,else那些的)區域的"{}"自動檢測,當區域只含有一條子語 句而沒有添加"{}"時,軟件會自動進行添加,這也是爲了培養良好的編程習慣。比如
- if(a>b)
- System.out.println("NO {...}");
經處理後會變成
- if(a>b){
- System.out.println("NO {...}");
- }
即使你寫出這樣的語句:
- if()if()for(;;)if()a=0;
它也會幫你變得整整齊齊:
- if()
- {
- if()
- {
- for(;;)
- {
- if()
- {
- a=0;
- }
- }
- }
- }
(2)軟件會自動規範統一註釋,也會進行整齊排版。
比如
- /*abcd
- ef
- */
會變成
- /*
- abcd
- ef
- */
但 /**aaaaa*/ 卻不會改變。
就先寫這麼多,其他的如果感興趣可以使用然後去了解,我會將軟件開源,將源代碼貢獻出來並附帶詳細註釋(代碼量不是很大,大概5000行,大三學生,代碼沒深度易理解,也可以作爲新手學習材料),如果大家有興趣的話也可以爲軟件添磚增瓦,將其功能做得更強大。最近要開始忙學校的一些事了,所以對於源代碼整理可能還需要些時間。
如果你有一個風格寫得很遭的代碼文件test.java,想把它用ak風格重新排版,增加上頭部註釋,隔開數目運算符,每個方法區之間以空行隔開,並且輸出字符格式指定爲utf8,那麼你只需要這麼做:
jstyle -s=ak -co=utf8 --o=ah:po test.java,
片秒過後,整齊的代碼就出來了。那麼原先的代碼還在嗎?在,原始的代碼會保存在.jo的文件中,也就是test.java.jo(不否認這點參考了Artistic Style的設計思想).不知道怎麼使用的時候就找jstyle -help或者jstyle -h.
最後希望大家會喜歡這款軟件,尤其是喜歡JAVA語言的朋友。