2

我想知道我们如何更好地使用 else-if 运算符来重构这部分代码。什么时候用不同的扩展进行 eguals 检查?

代码:

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

或者更好的是,我会创建一个 FileFilter,它只接受具有可接受扩展名之一的目录和文件(使用相同的集合和getExtension()方法),并且会使用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 回答