黑马程序员技术交流社区
标题:
关于java源代码的mini过程---源码共享
[打印本页]
作者:
straw
时间:
2013-7-22 22:45
标题:
关于java源代码的mini过程---源码共享
本帖最后由 straw 于 2013-7-22 22:49 编辑
什么是mini?其实就是微小的意思.jquery有mini版本,原理就是将多余的注释和空格删除掉,这样程序加载运行起来就会相对较快些.
于是本人就想起要给java源代码做相应的mini操作然后在编译成class文件,经过验证确实mini后的java文件编译出来的新class文件比
原没有mini前java文件编译出的class文件还要小10%左右.单从这结果来看,在不改动原程序功能 安全等情况下缩小程序体积,应该能让程序
性能提升10%左右吧?本人还是菜鸟,希望有对这方面研究过的网友说说你们的看法,或可以将代码进行改进的贴出来,大家探讨探讨.下面是本人
关于MiniUtil的完整代码:
/*
* miniJava是将java文本文件经过删除注释删除多余空格后的java文件
* 经过mini后的java源代码体积要小上很多,这样类加载器加载速度就会加快很多
* 程序运行速度也会加快
* 使用方法 :1:MiniUtil.mini(String filePath); //开始mini,参数为文件名或文件夹的绝对路径
mini后要对原文件或文件夹进行临时文件清理(注意:mini()和delTem()方法不能同时在一次线程运行,否则mini将没有意义
原因尚未明确)
2:MiniUtil.delTem(String filePath);//删除临时文件,参数为文件名或文件夹的绝对路径
* */
public class MiniUtil {
//标记是否打印已进行mini压缩
static boolean isdeled=false;
public static void delTemFiles(String fileUrlAndName){
delTem(fileUrlAndName);
if (!isdeled) {
System.out.println("清除临时文件完成");
}
}
private static void delTem(String fileUrlAndName){
//删除压缩过的java文件 同时还原原java文件
File f=new File(fileUrlAndName);
if(f.isFile()){
//new File("e:\\MyJson.java").delete();
//new File("e:\\MyJson.java"+".txt").renameTo(new File("e:\\MyJson.java"));
if (fileUrlAndName.endsWith(".java")) {
// 判断是否有fileUrlAndName.txt文件 有则说明已mini过 否则还没有mini 不能删除
if (new File(fileUrlAndName + ".txt").isFile()) {
// 删除fileUrlAndName
new File(fileUrlAndName).delete();
// 重命名fileUrlAndName.txt 为fileUrlAndName
new File(fileUrlAndName + ".txt").renameTo(new File(
fileUrlAndName));
} else {
System.out.println("您还没有对文件" + fileUrlAndName + "进行mini压缩");
isdeled = true;
}
}
}
if(f.isDirectory()){
//是文件夹 返回文件和目录的个字符数组
String[] str=f.list();
for(String path:str){
//System.out.println(fileUrlAndName+"\\"+path);
delTem(fileUrlAndName+"\\"+path);
}
}
}
public static void mini(String fileUrlAndName){
File f=new File(fileUrlAndName);
if(f.isFile()){
//如果是java文件则mini
if(fileUrlAndName.endsWith(".java")){
run(fileUrlAndName);
System.out.println("mini完成:"+fileUrlAndName);
}
}
if(f.isDirectory()){
//是文件夹 返回文件和目录的个字符数组
String[] str=f.list();
for(String path:str){
//System.out.println(fileUrlAndName+"\\"+path);
mini(fileUrlAndName+"\\"+path);
}
}
}
private static void run(String fileUrlAndName){
//创建file原文件
BufferedReader br=null;
//创建临时文件*.txt
String temFileName=fileUrlAndName.substring(0,fileUrlAndName.length()-5)+"_tem.java";
FileWriter fw=null;
try {
br=new BufferedReader(new FileReader(fileUrlAndName));
fw=new FileWriter(temFileName);
String line=null;
boolean flag=false; //标记是否是多行注释行否为false 是为true
while((line=br.readLine())!=null){
//判断是否为单行注释行
if(!line.trim().startsWith("//")){
//判断是否为多行注释
if(line.trim().startsWith("/*")){
flag=true;
}
//飞多行注释时执行读写
if (!flag) {
// 去除每行前后的空格
line=line.trim();
//去除每行代码后面的//注释
if(line.contains("//")){
line=line.substring(0,line.indexOf("/"));
}
fw.write(line);
fw.flush();
}
//检测到多行注释结束标记时将 flag标记设成false
if(line.trim().endsWith("*/")){
flag=false;
}
}
}
//关闭原读写流
Close.close(br, fw);
//修改源文件名为临时文件名 同时将临时文件名修改为源文件名
new File(fileUrlAndName).renameTo(new File(fileUrlAndName+".txt"));
new File(temFileName).renameTo(new File(fileUrlAndName));
//自定义编译类
MyJavac.javac(fileUrlAndName);
//删除临时文件
new File(temFileName).delete();
} catch (Exception e) {
e.printStackTrace();
}finally{
Close.close(br,fw);
}
}
//定义一个流关闭资源类Close
private static class Close{
private static void close(BufferedReader br,FileWriter fw){
if(br!=null){
try {
br.close();
} catch (Exception e) {
throw new RuntimeException("流关闭异常");
}
}
if(fw!=null){
try {
fw.close();
} catch (Exception e) {
throw new RuntimeException("流关闭异常");
}
}
}
}
}
//调用编译器编译java原文件生成class文件的类
class MyJavac {
public static void javac(String fileUrlAndName){
try {
//调用cmd命令来编译压缩过的java源文件
Runtime.getRuntime().exec("cmd /c javac "+fileUrlAndName);
} catch (IOException e) {
e.printStackTrace();
}
}
//测试方法
public static void main(String[] args) {
}
}
复制代码
作者:
许庭洲
时间:
2013-8-18 05:27
值得学习ing!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2