A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© straw 中级黑马   /  2013-7-22 22:45  /  1604 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 straw 于 2013-7-22 22:49 编辑

什么是mini?其实就是微小的意思.jquery有mini版本,原理就是将多余的注释和空格删除掉,这样程序加载运行起来就会相对较快些.
于是本人就想起要给java源代码做相应的mini操作然后在编译成class文件,经过验证确实mini后的java文件编译出来的新class文件比
原没有mini前java文件编译出的class文件还要小10%左右.单从这结果来看,在不改动原程序功能 安全等情况下缩小程序体积,应该能让程序
性能提升10%左右吧?本人还是菜鸟,希望有对这方面研究过的网友说说你们的看法,或可以将代码进行改进的贴出来,大家探讨探讨.下面是本人
关于MiniUtil的完整代码:
  1. /*
  2. * miniJava是将java文本文件经过删除注释删除多余空格后的java文件
  3. * 经过mini后的java源代码体积要小上很多,这样类加载器加载速度就会加快很多
  4. * 程序运行速度也会加快
  5. * 使用方法 :1:MiniUtil.mini(String filePath); //开始mini,参数为文件名或文件夹的绝对路径
  6. mini后要对原文件或文件夹进行临时文件清理(注意:mini()和delTem()方法不能同时在一次线程运行,否则mini将没有意义
  7. 原因尚未明确)
  8. 2:MiniUtil.delTem(String filePath);//删除临时文件,参数为文件名或文件夹的绝对路径
  9. * */

  10. public class MiniUtil {
  11. //标记是否打印已进行mini压缩
  12. static boolean isdeled=false;
  13. public static void delTemFiles(String fileUrlAndName){
  14. delTem(fileUrlAndName);
  15. if (!isdeled) {
  16. System.out.println("清除临时文件完成");
  17. }
  18. }
  19. private static void delTem(String fileUrlAndName){
  20. //删除压缩过的java文件 同时还原原java文件
  21. File f=new File(fileUrlAndName);
  22. if(f.isFile()){
  23. //new File("e:\\MyJson.java").delete();
  24. //new File("e:\\MyJson.java"+".txt").renameTo(new File("e:\\MyJson.java"));
  25. if (fileUrlAndName.endsWith(".java")) {
  26. // 判断是否有fileUrlAndName.txt文件 有则说明已mini过 否则还没有mini 不能删除
  27. if (new File(fileUrlAndName + ".txt").isFile()) {
  28. // 删除fileUrlAndName
  29. new File(fileUrlAndName).delete();
  30. // 重命名fileUrlAndName.txt 为fileUrlAndName
  31. new File(fileUrlAndName + ".txt").renameTo(new File(
  32. fileUrlAndName));
  33. } else {
  34. System.out.println("您还没有对文件" + fileUrlAndName + "进行mini压缩");
  35. isdeled = true;
  36. }
  37. }
  38. }
  39. if(f.isDirectory()){
  40. //是文件夹 返回文件和目录的个字符数组
  41. String[] str=f.list();
  42. for(String path:str){
  43. //System.out.println(fileUrlAndName+"\\"+path);
  44. delTem(fileUrlAndName+"\\"+path);
  45. }
  46. }
  47. }
  48. public static void mini(String fileUrlAndName){
  49. File f=new File(fileUrlAndName);
  50. if(f.isFile()){
  51. //如果是java文件则mini
  52. if(fileUrlAndName.endsWith(".java")){
  53. run(fileUrlAndName);
  54. System.out.println("mini完成:"+fileUrlAndName);
  55. }
  56. }
  57. if(f.isDirectory()){
  58. //是文件夹 返回文件和目录的个字符数组
  59. String[] str=f.list();
  60. for(String path:str){
  61. //System.out.println(fileUrlAndName+"\\"+path);
  62. mini(fileUrlAndName+"\\"+path);
  63. }
  64. }
  65. }
  66. private static void run(String fileUrlAndName){
  67. //创建file原文件
  68. BufferedReader br=null;
  69. //创建临时文件*.txt
  70. String temFileName=fileUrlAndName.substring(0,fileUrlAndName.length()-5)+"_tem.java";
  71. FileWriter fw=null;
  72. try {
  73. br=new BufferedReader(new FileReader(fileUrlAndName));
  74. fw=new FileWriter(temFileName);
  75. String line=null;
  76. boolean flag=false; //标记是否是多行注释行否为false 是为true
  77. while((line=br.readLine())!=null){
  78. //判断是否为单行注释行
  79. if(!line.trim().startsWith("//")){
  80. //判断是否为多行注释
  81. if(line.trim().startsWith("/*")){
  82. flag=true;
  83. }
  84. //飞多行注释时执行读写
  85. if (!flag) {
  86. // 去除每行前后的空格
  87. line=line.trim();
  88. //去除每行代码后面的//注释
  89. if(line.contains("//")){
  90. line=line.substring(0,line.indexOf("/"));
  91. }
  92. fw.write(line);
  93. fw.flush();
  94. }
  95. //检测到多行注释结束标记时将 flag标记设成false
  96. if(line.trim().endsWith("*/")){
  97. flag=false;
  98. }
  99. }
  100. }
  101. //关闭原读写流
  102. Close.close(br, fw);
  103. //修改源文件名为临时文件名 同时将临时文件名修改为源文件名
  104. new File(fileUrlAndName).renameTo(new File(fileUrlAndName+".txt"));
  105. new File(temFileName).renameTo(new File(fileUrlAndName));
  106. //自定义编译类
  107. MyJavac.javac(fileUrlAndName);
  108. //删除临时文件
  109. new File(temFileName).delete();
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }finally{
  113. Close.close(br,fw);
  114. }
  115. }
  116. //定义一个流关闭资源类Close
  117. private static class Close{
  118. private static void close(BufferedReader br,FileWriter fw){
  119. if(br!=null){
  120. try {
  121. br.close();
  122. } catch (Exception e) {
  123. throw new RuntimeException("流关闭异常");
  124. }
  125. }
  126. if(fw!=null){
  127. try {
  128. fw.close();
  129. } catch (Exception e) {
  130. throw new RuntimeException("流关闭异常");
  131. }
  132. }
  133. }
  134. }

  135. }
  136. //调用编译器编译java原文件生成class文件的类
  137. class MyJavac {
  138. public static void javac(String fileUrlAndName){
  139. try {
  140. //调用cmd命令来编译压缩过的java源文件
  141. Runtime.getRuntime().exec("cmd /c javac "+fileUrlAndName);
  142. } catch (IOException e) {
  143. e.printStackTrace();
  144. }

  145. }
  146. //测试方法
  147. public static void main(String[] args) {
  148. }
  149. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马