编写一个java程序来删除同一个java程序中的注释?

时间:2012-02-09 05:47:19

标签: java process

我正在编写一个java程序来删除同一个java程序中的注释。 我在考虑使用文件阅读器。但我不确定它是否会奏效。

因为两个进程将使用相同的文件。 但我认为在执行代码之前,java文件将生成.class文件。 因此,如果我使用filereader来编辑java文件。它不应该让我错误,另一个进程已经在使用此文件。

我的想法是否正确?

提前致谢。

8 个答案:

答案 0 :(得分:7)

是的,你可以毫无问题地做到这一点。

注意:请注意以下事项:

String notAComment  = "// This is not a comment"; 

答案 1 :(得分:7)

如果您只想从Java程序中删除注释,为什么不使用正则表达式进行简单搜索和替换,并将所有注释转换为空字符串?

在Java中,这是一种冗长的方式:

import java.io.File;    
import java.io.FileReader;    
import java.io.IOException;    
import java.io.BufferedReader;    

class Cleaner{    

    public static void main( String a[] )    
    {    
        String source = readFile("source.java");    

        System.out.println(source.replaceAll("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)",""));    

    }    


    static String readFile(String fileName) {    

        File file = new File(fileName);    

        char[] buffer = null;    

        try {    
                BufferedReader bufferedReader = new BufferedReader( new FileReader(file));    

                buffer = new char[(int)file.length()];    

                int i = 0;    
                int c = bufferedReader.read();    

                while (c != -1) {    
                    buffer[i++] = (char)c;    
                    c = bufferedReader.read();    
                }    

        } catch (IOException e) {    
            e.printStackTrace();    
        }    

        return new String(buffer);    
    }    

}    

答案 2 :(得分:2)

你是对的,不是两个进程使用同一个文件,你的程序将使用.class文件并处理.java文件。您可能需要仔细查看此页面: Finding Comments in Source Code Using Regular Expressions

答案 3 :(得分:2)

是的,使用FileReader会有效。要注意的一件事是FileEncoding,如果你可能有非英文字符或跨不同平台工作。在Eclipse和其他IDE中,您可以将Java源文件的字符集更改为不同的编码。如果不确定,可能值得使用:

InputStream in = ....    
BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8"));
..

同样在输出输出时,请使用带UTF-8的OutputStreamWriter。

答案 4 :(得分:1)

查看帖子Remove comments from String来做你的事情。您可以使用FileReaderjava.util.Scanner类来读取文件。

答案 5 :(得分:1)

它很晚但可能会帮助一些人删除所有类型的评论。

package com.example;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
class CommentRemover {

    public static void main(String a[]) {
        File file = new File("F:/Java Examples/Sample.java");
        String fileString = readLineByLine(file);
        fileString = fileString.replaceAll(
                "(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)", "");
        System.out.println(fileString);

    }

    private static String readLineByLine(File file) {
        String textFile = "";
        FileInputStream fstream;
        try {
            fstream = new FileInputStream(file);
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    fstream));
            String strLine;
            while ((strLine = br.readLine()) != null) {
                textFile = textFile + replaceComments(strLine) + "\n";

            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return textFile;
    }

    private static String replaceComments(String strLine) {

        if (strLine.startsWith("//")) {
            return "";
        } else if (strLine.contains("//")) {
            if (strLine.contains("\"")) {
                int lastIndex = strLine.lastIndexOf("\"");
                int lastIndexComment = strLine.lastIndexOf("//");
                if (lastIndexComment > lastIndex) { // ( "" // )
                    strLine = strLine.substring(0, lastIndexComment);
                }
            } else {
                int index = strLine.lastIndexOf("//");
                strLine = strLine.substring(0, index);
            }
        }

        return strLine;
    }

}

答案 6 :(得分:0)

我为这种必要性制作了一个开源android:layout_weight,你可以删除单行和多行Java注释。

它支持删除或不删除TODO 它也支持JavaScript,HTML,CSS,属性,JSP和XML注释。

小代码片段如何使用它(有2种类型用法):

第一种方式是InternalPath

 public static void main(String[] args) throws CommentRemoverException {

 // example for externalInternalPath

 CommentRemover commentRemover = new CommentRemover.CommentRemoverBuilder()
        .removeJava(true) // Remove Java file Comments....
        .removeJavaScript(true) // Remove JavaScript file Comments....
        .removeJSP(true) // etc..
        .removeTodos(true) // Remove todos
        .removeSingleLines(false) // Do not remove single line type comments
        .removeMultiLines(true) // Remove multiple type comments
        .startExternalPath("/Users/user/Projects/MyOtherProject")// Give it full path for external directories
        .setExcludePackages(new String[]{"src.main.java.model"}) // Refers to /Users/user/Projects/MyOtherProject/src/main/java/model and skips this directory.
        .build();

 CommentProcessor commentProcessor = new CommentProcessor(commentRemover);
                  commentProcessor.start();        
  }

第二种方式ExternalPath

CREATE TABLE #Table1
    (
      [uid] INT ,
      [company] VARCHAR(7) ,
      [last_complaint] DATETIME
    );

INSERT  INTO #Table1
        ( [uid], [company], [last_complaint] )
VALUES  ( 1, 'Foo inc', '2015-01-01 00:00:00' ),
        ( 2, 'Bar ltd', '2015-02-02 00:00:00' ),
        ( 3, 'Baz inc', '2015-03-03 00:00:00' ),
        ( 4, 'Bar ltd', '2015-04-04 00:00:00' ),
        ( 5, 'Foo inc', '2015-05-05 00:00:00' );

SELECT  #Table1.*
FROM    #Table1
        INNER JOIN ( SELECT company ,
                            ROW_NUMBER() OVER ( ORDER BY MAX(last_complaint) DESC ) rn
                     FROM   #Table1
                     GROUP BY company
                   ) t ON t.company = #Table1.company
ORDER BY rn ,
        last_complaint DESC

DROP TABLE #Table1

答案 7 :(得分:-1)

public class Copy {

void RemoveComments(String inputFilePath, String outputFilePath) throws FileNotFoundException, IOException {
    File in = new File(inputFilePath);
    File out = new File(outputFilePath);
    BufferedReader bufferedreader = new BufferedReader(new FileReader(in));
    PrintWriter pw = new PrintWriter(new FileWriter(out));
    String line = null, lineToRemove = null;
    while ((line = bufferedreader.readLine()) != null) {
        if (line.startsWith("/*") && line.endsWith("*/")) {
            lineToRemove = line;
        }
        if (!line.trim().equals(lineToRemove)) {
            pw.println(line);
            pw.flush();
        }
    }
}

}