今天在群里面一个网友提起说DWR之类的核心JS文件注释和空格占了大部分空间,如果去掉注释可以极大提高网站
的响应速度,正好下午没事,花了一个多小时帮他写了个这样的工具出来,工具虽然简单,但是很实用,贴出来跟大
家分享下。适用于js跟java文件。
public class CompressCode {
private boolean nodeflag=false; //注释flag,初始化为false,没有进入注释区
private int removecount=0;
private boolean strflag=false; //""符号注释
private boolean singlenode=false; //单行注释
public void processCode(String oldfile,String newfile){
try {
BufferedReader reader=new BufferedReader(new FileReader(oldfile));
BufferedWriter writer=new BufferedWriter(new FileWriter(newfile,false));
String recoder=null;
while((recoder=reader.readLine())!=null){
recoder=recoder.trim();
if(recoder.startsWith("//")||recoder.startsWith("/t//"))
continue;
char[] chs=recoder.toCharArray();
processChar(chs);
writer.write(chs, 0,chs.length-removecount);
writer.write(32);
removecount=0;
}
writer.flush();
writer.close();
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void processChar(char[] chs){
for(int i=0;i<chs.length;i++){
//进入注释
if(chs[i]=='/'&&i<chs.length-1&&chs[i+1]=='*'&&!nodeflag&&!singlenode&&!strflag){
removechar(chs,i);
nodeflag=true;
continue;
}
//判断是否计入了“”
if(chs[i]=='"'&&!nodeflag&&!singlenode){
if(!strflag)
strflag=true;
else
strflag=false;
}
//进入单行注释
if(chs[i]=='/'&&i<chs.length-1&&chs[i+1]=='/'&&!strflag&&!nodeflag){
removechar(chs,i);
singlenode=true;
continue;
}
//删除单行注释
if(singlenode){
if(i==chs.length-1){
singlenode=false;
}
removechar(chs,i);
continue;
}
//跳出注释
if(nodeflag&&chs[i]=='*'&&i<chs.length-1&&chs[i+1]=='/'){
removechar(chs,i);
removechar(chs,i+1);
nodeflag=false;
continue;
}
if(nodeflag){
removechar(chs,i);
}else{
if(chs[i]=='/n'){
removechar(chs,i);
}
}
}
}
private void removechar(char[] chs,int rmv_index){
removecount++;
for(int i=rmv_index;i<chs.length-1;i++){
chs[i]=chs[i+1];
}
}
public static void main(String[] args) {
CompressCode compress=new CompressCode();
compress.processCode(args[0],args[1]);
}
}