为大家推荐一款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')
       

  
  1. public class test  
  2.     public void test()     
  3.     {  
  4.          int a=0
  5.          if(a>0
  6.          { 
  7.           a=1
  8.          } 
  9.      } 
 
   (2) java:(或者S1,两次缩进为一个'\t')
 

  
  1. public class test { 
  2.     public void test(){  
  3.          int a=0
  4.          if(a>0){ 
  5.           a=1
  6.          } 
  7.      } 
 
   (3) linux:(或者S4,一次缩进为一个'\')
     

  
  1. public class test  
  2.         public void test()     
  3.         {  
  4.                  int a=0
  5.                  if(a>0
  6.                  { 
  7.                       a=1
  8.                  } 
  9.          } 
 
    (4) gnu:(或者S2,两次缩进为一个'\t')
 

  
  1. public class test  
  2.     public void test()     
  3.     {  
  4.          int a=0
  5.          if(a>0
  6.              { 
  7.               a=1
  8.              } 
  9.       } 
 
    (5) ak:(或者S3,一次缩进为一个'\t')
       

  
  1. public  
  2. abstract class test  
  3.   
  4. public 
  5. static void test() 
  6. {  
  7.         int a=0
  8.         if(a>0
  9.         { 
  10.             a=1
  11.         } 
  12. public 
  13. static int test1() 
  14. {  
  15.         int a=0
  16.         if(a>0
  17.         { 
  18.             a=1
  19.         } 
  20.         return 1
 
    (6) mini:(或者S6,两次缩进为一个'\t')

  
  1. public class test{ 
  2.     public void test(){  
  3.         int a=0
  4.         if(a>0
  5.         { 
  6.          a=1
  7.         } 
  8.     } 
 
 
  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:给源文件增加头部注释说明,风格如下:
 

  
  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  
  2.   *  xxxx.java 
  3.   *  @ author: 
  4.   *  @ version: 
  5.   * 
  6.   *  Directions: 
  7.   * 
  8.   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  
  9.   */ 
 
 
  (2) am:为每个方法区域增加注释,风格如下:
 

  
  1. /* 
  2.  * 
  3.  */ 
  4.  public void run(){} 
 
   
  (3) dc:删除文件中所有注释。
 
  (4) ra:修整数组,如下:
  
   

  
  1. int[]={1,2,3,4}         
    变为
   

  
  1. int[]={1, 
  2.        2, 
  3.        3, 
  4.        4} 
 
 
 

  
  1. int[][]={(1,2),(3,4),(5,6)} 
  变为  
 

  
  1. int[][]={(1,2), 
  2.          (3,4), 
  3.          (5,6)} 
 
 
   如果不指定默认为9个元素后自动换行。
 
  (5) ro:修整控制块。
   
   

  
  1. if(a>0||a>0&&a>0||a>0){ 
  2.     ..... 
   变为  

  
  1. if(a>0|| 
  2.    a>0|| 
  3.    a>0
  4.     ....  
 
   如果不指定默认3个关系运算后换行。
 
  (6) rs:修整switch语句。
 
 

  
  1. switch(a){          
  2. case 1:              
  3.     a;               
  4. case 2:              
  5.     b;               
    变为
    

  
  1. switch(a){          
  2.     case 1:              
  3.         a;               
  4.     case 2:              
  5.         b;               
  6.  
  (7) po:隔开双目运算符与两边元素。
 
   

  
  1. int a,b;    
  2. a=a+b; 
  变为
  

  
  1. int a,b; 
  2. a = a + b; 
   
   默认不隔开。
 
  (8) pb:隔开{与前面的元素。
   
 

  
  1. public void run(){ 
   变成
 

  
  1. public void run() { 
 
   默认不隔开。 
  
  (9) ps:隔开if,switch,for,while语句中"("与前面的元素。
 

  
  1. if(a>b){  
  2. ....   
   变为
  

  
  1. if (a>b){    
  2.     .... 
  3.  
  6.其他隐含功能。
  (1)软件会对程序中所以流程跳转语句(if,else那些的)区域的"{}"自动检测,当区域只含有一条子语 句而没有添加"{}"时,软件会自动进行添加,这也是为了培养良好的编程习惯。比如
 
 

  
  1. if(a>b) 
  2.     System.out.println("NO {...}"); 
 
 
 经处理后会变成
 

  
  1. if(a>b){ 
  2.      System.out.println("NO {...}"); 
 
 
  即使你写出这样的语句:

  
  1. if()if()for(;;)if()a=0
  它也会帮你变得整整齐齐:
 
 

  
  1. if()  
  2. {     
  3.     if()  
  4.     {         
  5.         for(;;)  
  6.         {     
  7.             if()  
  8.             {  
  9.                 a=0;  
  10.             }  
  11.         }  
  12.     }     
  13. }   
 
  (2)软件会自动规范统一注释,也会进行整齐排版。
 
   比如          

  
  1. /*abcd 
  2.         ef 
  3.          */ 
 
   会变成
 
       

  
  1. /* 
  2. abcd 
  3. ef 
  4. */ 
 
  但  /**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语言的朋友。