Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2882)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.
java:100)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390
)
        at java.lang.StringBuffer.append(StringBuffer.java:224)
        at Dc2.profile(Dc2.java:37)
        at Dc2.prodir(Dc2.java:77)
        at Dc2.prodir(Dc2.java:74)
        at Dc2.dispReq(Dc2.java:87)
        at Dc2.main(Dc2.java:106) 遇到读*.gif,*.scr等文件也会破坏掉文件,所以要求跳过这两种类型文件和加密过的文件;
哪位能改进这段代码,使其能正常使用呢?
******************************************/*
*把指定目录下的java源码去掉注释放到另一目录下
*作者:钝秀才 2005/7/14
*/import java.io.*;//把指定目录下的java源码去掉注释放到另一目录下
public class Dc2 {static String srcStr = "E:\\upload";
static String desStr = "E:\\uploadre";//处理文件
private void profile(File src, File des) throws Exception {StringBuffer content = new StringBuffer();
StringBuffer output1 = new StringBuffer();
StringBuffer output2 = new StringBuffer();
String temp;
int start = 0;
int end = 0;
int from = 0;BufferedReader br = new BufferedReader(new FileReader(src));
BufferedWriter bw = new BufferedWriter(new FileWriter(des));while ( (temp = br.readLine()) != null) {
content.append(temp);
content.append("\n");
}//弃掉/* ... */注释,未考虑以//*开头的注释,
//且未考虑/*、*/等包含在""内的情形
//指定from以提高速度
while ( (start = content.indexOf("/*", start)) != -1) {
output1.append(content.substring(from, start));
from = content.indexOf("*/", start) + 2;
start = from;
}
output1.append(content.substring(from));//弃掉// ... 注释
start = 0;
from = 0;
while ( (start = output1.indexOf("//", start)) != -1) {
output2.append(output1.substring(from, start));
from = output1.indexOf("\n", start); //保留回车换行
if (from == -1) { //不以"\n"结束
from = output1.length();
break;
}
start = from;
}
output2.append(output1.substring(from));bw.write(output2.toString());
br.close();
bw.close();
}
//处理目录
private void prodir(File src, File des) throws Exception {des.mkdir(); //创建目录
File[] files = src.listFiles();for (int i = 0; i < files.length; i++) {
//下一级目录/文件
File nf = new File(des, files[i].getName());
if (files[i].isDirectory()) {
//是目录,递归
prodir(files[i], nf);
}
else { //文件
profile(files[i], nf);
}
}
}
//输入目录还是文件
public void dispReq(File src, File des) throws Exception {if (src.isDirectory()) {
prodir(src, des);
}
else {
profile(src, des);
}
}
public static void main(String[] args) {long starttime = System.currentTimeMillis();if (args.length >= 2) {
srcStr = args[0];
desStr = args[1];
}
File src = new File(srcStr);
File des = new File(desStr);
try {
new Dc2().dispReq(src, des);
}
catch (Exception ex) {
System.out.println(ex);
}
long endtime = System.currentTimeMillis();
long usetime = endtime - starttime;
System.out.println("total use: " + usetime + " ms.");
}}

解决方案 »

  1.   

    或是写一个正则表达式可以批量去掉注释
    ,文件中有
    ***************************************
    /* ------------------------------------- (C) 2000-2006 .
     http://www.abc.com
    ------------------------------------- */
    /*
    [abc] (C)2000-2006 .
    $RCSfile: $
    $Revision:  $
    $Date: 2005/11/11 08:56:44 $
    */
      

  2.   

    你不会改一下,只改后缀为.java的文件啊