关于排除注释行

时间:2012-07-01 06:31:27

标签: java string collections io

我正在尝试开发计算我的源文件代码行的应用程序..

package asd;
    public class abv {
        /**
         * @param args
         */
        public static void main(String[] args) {
    // comment
    /* comment*/
        }
    }

以下是代码.....

 private static int totalLineCount = 0;
    private static int totalFileScannedCount = 0;

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

        JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(new java.io.File("C:" + File.separator));
        chooser.setDialogTitle("FILES ALONG WITH LINE NUMBERS");
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed(false);
        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            Map<File, Integer> result = new HashMap<File, Integer>();
            File directory = new File(chooser.getSelectedFile().getAbsolutePath());

            List<File> files = getFileListing(directory);

            // print out all file names, in the the order of File.compareTo()
            for (File file : files) {
               // System.out.println("Directory: " + file);
                getFileLineCount(result, file);
                //totalFileScannedCount += result.size(); //saral
            }

            System.out.println("*****************************************");
            System.out.println("FILE NAME FOLLOWED BY LOC");
            System.out.println("*****************************************");

            for (Map.Entry<File, Integer> entry : result.entrySet()) {
                System.out.println(entry.getKey().getAbsolutePath() + " ==> " + entry.getValue());
            }
            System.out.println("*****************************************");
            System.out.println("SUM OF FILES SCANNED ==>" + "\t" + totalFileScannedCount);
            System.out.println("SUM OF ALL THE LINES ==>" + "\t" + totalLineCount);
        }

    }


    public static void getFileLineCount(final Map<File, Integer> result, final File directory)
            throws FileNotFoundException {
        File[] files = directory.listFiles(new FilenameFilter() {

            public boolean accept(final File directory, final String name) {
                if (name.endsWith(".java")) {
                    return true;
                } else {
                    return false;
                }
            }
        });
        for (File file : files) {
            if (file.isFile()) {
                Scanner scanner = new Scanner(new FileReader(file));
                int lineCount = 0;
                totalFileScannedCount ++; //saral
                try {

                    /*for (lineCount = 0; scanner.nextLine() != null;lineCount++ ) { //saral
                        ;


                    }*/


                    while (scanner.hasNextLine()) {
                           String line = scanner.nextLine().trim();
                           if (!line.isEmpty()) {
                              System.out.println("debug-->"+line); // to debug cross checked that no whitespaces are there 
                             lineCount++;
                           }
                    }

                     result.put(file, lineCount);
                     totalLineCount += lineCount;                               
                } catch (NoSuchElementException e) {
                    // e.printStackTrace();
                }
            }
        }

    }

    /**
     * Recursively walk a directory tree and return a List of all Files found;
     * the List is sorted using File.compareTo().
     * 
     * @param aStartingDir
     *            is a valid directory, which can be read.
     */
    static public List<File> getFileListing(final File aStartingDir) throws FileNotFoundException {
        validateDirectory(aStartingDir);
        List<File> result = getFileListingNoSort(aStartingDir);
        Collections.sort(result);
        return result;
    }

    // PRIVATE //
    static private List<File> getFileListingNoSort(final File aStartingDir) throws FileNotFoundException {
        List<File> result = new ArrayList<File>();
        File[] filesAndDirs = aStartingDir.listFiles();
        List<File> filesDirs = Arrays.asList(filesAndDirs);
        for (File file : filesDirs) {
            if (file.isDirectory()) {
                result.add(file);
            }
            if (!file.isFile()) {
                // must be a directory
                // recursive call!
                List<File> deeperList = getFileListingNoSort(file);
                result.addAll(deeperList);
            }
        }
        return result;
    }

    /**
     * Directory is valid if it exists, does not represent a file, and can be
     * read.
     */
    static private void validateDirectory(final File aDirectory) throws FileNotFoundException {
        if (aDirectory == null) {
            throw new IllegalArgumentException("Directory should not be null.");
        }
        if (!aDirectory.exists()) {
            throw new FileNotFoundException("Directory does not exist: " + aDirectory);
        }
        if (!aDirectory.isDirectory()) {
            throw new IllegalArgumentException("Is not a directory: " + aDirectory);
        }
        if (!aDirectory.canRead()) {
            throw new IllegalArgumentException("Directory cannot be read: " + aDirectory);
        }
    }

现在出现的问题是。当我选择项目文件夹并在控制台上查看结果时,它会计算我的java文件的代码行,但它也会对注释进行计数,我甚至不希望评论得到计数,这意味着评论的行不会被计算作为代码行,请告知需要在代码片段中进行哪些修改...

下面的输出是我在控制台上的输出..

debug-->package asd;
debug-->public class abv {
debug-->/**
debug-->* @param args
debug-->*/
debug-->public static void main(String[] args) {
debug-->// comment
debug-->/* comment*/
debug-->}
debug-->}
*****************************************
FILE NAME FOLLOWED BY LOC
*****************************************
C:\Users\vaio\Desktop\Demo\fg\src\asd\abv.java ==> 10
*****************************************
SUM OF FILES SCANNED ==>    1
SUM OF ALL THE LINES ==>    10

请告知在代码中需要进行哪些修改...

2 个答案:

答案 0 :(得分:1)

我对此的第一次尝试是使用正则表达式。鉴于源文件不会那么大,您可以将整个行读取到一个字符串中,运行一个正则表达式,用任何内容替换所有注释,然后计算新字符串中的行。

我的Java有点生疏,但我相信这会有效(没有现在可以测试的环境):

int count = 0;
Scanner scanner = new Scanner(new File(file));
scanner.useDelimiter("\\Z");
String data = scanner.next();
String cleaned = data.replaceAll("/\\*(?:.|[\\n\\r])*?\\*/",""));
LineNumberReader lnr = new LineNumberReader(new StringReader(cleaned));
String line;
while ((line = lnr.readLine()) != null)
{
    String sline = line.trim();
    if(sline.isEmpty() == false)
        if(!(sline.length() > 2 && sline.charAt(0) == '/' && sline.charAt(1) == '/'))
            count += 1;
            //separated for clarity
}

这应该为您提供不是所有注释的行数//并且还处理多行注释。

来自正则表达式的评论来源:Regex source

答案 1 :(得分:0)

我以前的回答不正确。因为你把它标记为正确所以我使用了代码 @Trickfire编辑我的答案。

while (scanner.hasNextLine()) {

                   scanner.useDelimiter("\\Z");
                   String data = scanner.next();
                   String cleaned = data.replaceAll("/\\*(?:.|[\\n\\r])*?\\*/",""));
                   LineNumberReader lnr = new LineNumberReader(new StringReader(cleaned));
                   String line;
                   while ((line = lnr.readLine()) != null)
                    {
                      String sline = line.trim();
                      if(sline.isEmpty() == false)
                      if(!(sline.length() > 2 && sline.charAt(0) == '/' && sline.charAt(1) == '/'))
                          lineCount += 1;
                           //separated for clarity
                   }


                }