2

コードのこの部分をelse-if演算子を使用してより適切に修正する方法を知りたいです。異なるエクステンションで euals チェックが実行されるのはいつですか?

コード:

    private void findFiles(String path) {

        try {
            File root = new File(path);
            File[] list = root.listFiles();
            for (File currentFile : list) {
                if (currentFile.isDirectory()) {
                    findFiles(currentFile.getAbsolutePath());
                } else {
                    if (currentFile.getName().toLowerCase().endsWith((".txt"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".pdf"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".doc"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".docx"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".html"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".htm"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".xml"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".djvu"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".djv"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".rar"))) {
                        queue.put(currentFile);
                    } else if (currentFile.getName().toLowerCase()
                            .endsWith((".rtf"))) {
                        queue.put(currentFile);
                    } 
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

質問:

  • コードをリファクタリングするより良い方法は? 理解できるように簡単にし
    ます。
  • extentions バリアントをチェックする別の方法を使用できますか?

ありがとう、
ナザール。

4

6 に答える 6

8

チェック拡張機能のリスト全体を次のように置き換えることができます。

// outside the loop (or even method):
Set<String> extensions = new HashSet<>(Arrays.asList(".txt", ".pdf", ".doc",
                 ".docx", ".html", ".htm", ".xml", ".djvu", ".rar", ".rtf"));
// in the loop:
String fileName = currentFile.getName().toLowerCase();
if (extensions.contains(fileName.substring(fileName.lastIndexOf(".")))) {
    queue.put(currentFile);
}
于 2013-02-24T10:36:11.127 に答える
2

最善の解決策は、次のように、これを STRATEGY パターンにリファクタリングすることです

于 2013-02-24T10:37:26.300 に答える
2

正規表現を使用できます:

String s = currentFile.getName().toLowerCase();
if (s.matches("^.+?\\.(txt|pdf|doc|docx|html|htm|xml|djvu|rar|rtf)$")) {
    queue.put(currentFile);
}

これは、実行されるアクションがすべての拡張機能で同じであることを前提としています。

詳細に:

^         beginning of string
.+        one or more characters
?         non greedy -> don't consume characters that match the rest of the regex
\\.       a period
(pdf|doc) match pdf or doc
$         the end of the string
于 2013-02-24T10:39:56.820 に答える
2

ファイルの拡張子と、受け入れられる拡張子の最終的なセットを返す getExtension() メソッドを作成します。

private static final Set<String> ACCEPTED_EXTENSIONS = 
    Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(".txt", ".doc", ...));

private String getExtension(File f) {
    // TODO return the extension of the file
}

コードは次のように縮小されます。

private void findFiles(String path) {

    try {
        File root = new File(path);
        File[] list = root.listFiles();
        for (File currentFile : list) {
            if (currentFile.isDirectory()) {
                findFiles(currentFile.getAbsolutePath());
            } 
            else if (ACCEPTED_EXTENSIONS.contains(getExtension(currentFile))) {
                queue.put(currentFile);
            }
        }
    } 
    catch (InterruptedException e) {
        e.printStackTrace();
    }

getExtension()または、さらに良いことに、(同じセットとメソッドを使用して) 受け入れられた拡張子の 1 つを持つディレクトリとファイルのみを受け入れる FileFilter を作成し、root.listFiles(fileFilter).

于 2013-02-24T10:40:45.803 に答える
1

メソッドを作成する

public boolean isPermissibleFileType(String fileName){
    String[] fileTypes = {".pdf",".doc",".docx",".html",".htm",".xml",".djvu",".djv",".rar",".rtf"};
    return Arrays.asList(fileTypes).contains(fileName.substring(fileName.lastIndexOf('.')).toLowerCase());
}

ループでメソッドを使用

private void findFiles(String path) {

        try {
            File root = new File(path);
            File[] list = root.listFiles();
            for (File currentFile : list) {
                if (currentFile.isDirectory()) {
                    findFiles(currentFile.getAbsolutePath());
                } else {
                    if(isPermissibleFileType(currentFile.getName()){
                       queue.put(currentFile);
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
于 2013-02-24T10:41:21.777 に答える
0

クラスFileNameFilterを使用して、拡張子チェックをいくつかのヘルパー メソッドに抽出できます。そして、再帰のために、元のファインダーメソッドを使用できます。

于 2013-02-24T10:43:06.707 に答える