Написание Java-программы для удаления комментариев в той же Java-программе? - PullRequest
0 голосов
/ 09 февраля 2012

Я пишу Java-программу для удаления комментариев в той же Java-программе. Я думаю об использовании файлового ридера. Но я не уверен, сработает ли это.

Потому что два процесса будут использовать один и тот же файл. Но я думаю, что перед выполнением кода файл java создаст файл .class. Так что, если я использую filereader для редактирования файла Java. Это не должно дать мне ошибку, что другой процесс уже использует этот файл.

Правильно ли я думаю?

Заранее спасибо.

Ответы [ 8 ]

7 голосов
/ 09 февраля 2012

Если вы просто хотите удалить комментарии из 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);    
    }    

}    
7 голосов
/ 09 февраля 2012

Да, вы можете сделать это без проблем.

Примечание: будьте осторожны с такими вещами, как:

String notAComment  = "// This is not a comment"; 
2 голосов
/ 09 февраля 2012

Да, использование FileReader будет работать. Стоит обратить внимание на FileEncoding, если у вас могут быть не английские символы или вы работаете на разных платформах. В Eclipse и других IDE вы можете изменить набор символов для исходного файла Java на другие кодировки. Если вы не уверены, возможно, стоит использовать:

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

и аналогично, когда вы выводите вывод обратно, используйте OutputStreamWriter с UTF-8.

2 голосов
/ 09 февраля 2012

Вы правы, это не два процесса, использующие один и тот же файл, ваша программа будет использовать файлы .class и обрабатывать файлы .java. Возможно, вы захотите поближе взглянуть на эту страницу: Поиск комментариев в исходном коде с использованием регулярных выражений

1 голос
/ 16 марта 2015

Уже поздно, но это может помочь некоторым удалить все типы комментариев.

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;
    }

}
1 голос
/ 09 февраля 2012

Взгляните на пост Удалите комментарии из String для выполнения ваших задач. Вы можете использовать класс FileReader или java.util.Scanner для чтения файла.

0 голосов
/ 13 июля 2015

Я создал библиотеку с открытым исходным кодом (CommentRemover на GitHub) для этой необходимости вы можете удалить однострочные и многострочные комментарии Java.

Он поддерживает удаление или НЕ удаляет TODO.
Также поддерживаются комментарии JavaScript, HTML, CSS, Properties, JSP и XML.

Небольшой фрагмент кода, как его использовать (используется 2 типа):

Первый способ InternalPath

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

 // root dir is: /Users/user/Projects/MyProject
 // example for startInternalPath

 CommentRemover commentRemover = new CommentRemover.CommentRemoverBuilder()
        .removeJava(true) // Remove Java file Comments....
        .removeJavaScript(true) // Remove JavaScript file Comments....
        .removeJSP(true) // etc.. goes like that
        .removeTodos(false) //  Do Not Touch Todos (leave them alone)
        .removeSingleLines(true) // Remove single line type comments
        .removeMultiLines(true) // Remove multiple type comments
        .startInternalPath("src.main.app") // Starts from {rootDir}/src/main/app , leave it empty string when you want to start from root dir
        .setExcludePackages(new String[]{"src.main.java.app.pattern"}) // Refers to {rootDir}/src/main/java/app/pattern and skips this directory
        .build();

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

Второй способ ExternalPath

 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();        
  }
0 голосов
/ 26 января 2013

открытый класс Копировать {

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();
        }
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...