-4

今回はコードを修正し、コードの行数を数える目的は完璧でした。以下はコードの一部です..

 /**
     * @param args
     * @throws FileNotFoundException
     */
    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);
        }
    }

しかし、問題は、コンソールに結果を表示しているときに、以下の例外がスローされることです。それを克服する方法をアドバイスしてください

*****************************************
FILE NAME FOLLOWED BY LOC
*****************************************
C:\Users\vaio\Desktop\Demo\fg\src\asd\abv.java ==> 9
*****************************************
SUM OF FILES SCANNED ==>    1
SUM OF ALL THE LINES ==>    9
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    at sun.java2d.Disposer.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
4

4 に答える 4

1

問題は、ブロックtotalLineCount内を更新していることです。catch外側に移動します。

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

              result.put(file, lineCount); 
              totalLineCount += lineCount;   
            } catch (NoSuchElementException e) {
              e.printStackTrace();
            }
于 2012-07-01T05:47:15.980 に答える
0

NoSuchElement 例外が発生したときにのみ totalLineCount を更新しています。try catch ステートメントの外に移動するか、finally ブロックに配置する必要があります。

于 2012-07-01T05:47:28.723 に答える
0

あなたが持っている

totalLineCount += lineCount;

ただし、try ブロック内では、NoSuchElementException がスローされる原因となるものは何も表示されません。catch ブロックのコードを try ブロックに移動します。このコードは、例外ハンドラーとして適切ではないようです。少なくとも、例外が発生しても実行したい場合は、finally ブロックに入れます。

于 2012-07-01T05:47:36.447 に答える
0

私はあなたのコードを変更しました。あなたのコードを機能させるために私が何をしたかを理解しようとします-

 public class LineCount{ 
private static int totalLineCount = 0;
private static int totalFileScannedCount = 0;

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

    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);
            result  = 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 Map<File, Integer> getFileLineCount(final Map<File, Integer> result, final File file)
        throws FileNotFoundException {


    if (file.isFile()) {
            Scanner scanner = new Scanner(new FileReader(file));
            int lineCount = 0;
           // totalFileScannedCount ++; //saral
            try {
                /*for (lineCount = 0; scanner.nextLine() != null; ) { //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++;
                       }
                }


            } catch (NoSuchElementException e) {


            }
            result.put(file, lineCount);
            totalLineCount += lineCount;
        }
    return result;
    }

//}

/**
 * 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(new FilenameFilter() {

        public boolean accept(final File directory, final String name) {
            if (name.endsWith(".java")) {
                return true;
            } else {
                return false;
            }
        }
    });


    List<File> filesDirs = Arrays.asList(filesAndDirs);

    for (File file : filesDirs) {
        if (file.isFile()) {
            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ファイルをフォルダに入れてこのコードを実行しました - 結果は次のとおりです -


LOC が続くファイル名


/home/hkr/Desktop/LineCount.java ==> 129


スキャンされたファイルの合計 ==> 1 行すべての合計 ==> 129

于 2012-07-01T06:11:56.177 に答える