java - 如何考虑方法中的少数参数

标签 java file io

我有自己的 SimpleFileVisitor 实现,其中包含访问文件方法。 我想知道如果有多个参数,如何执行更精确的搜索。这就是我的意思

public class SearchFileVisitor extends SimpleFileVisitor<Path>
{
    private String partOfName;
    private String partOfContent;
    private int minSize;
    private int maxSize;
    private List<Path> foundFiles = new ArrayList<>();

    public void setPartOfName(String partOfName)
    {
        this.partOfName = partOfName;
    }

    public void setPartOfContent(String partOfContent)
    {
        this.partOfContent = partOfContent;
    }

    public void setMinSize(int minSize)
    {
        this.minSize = minSize;
    }

    public void setMaxSize(int maxSize)
    {
        this.maxSize = maxSize;
    }

    public List<Path> getFoundFiles()
    {
        return foundFiles;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
    {
        if(partOfName != null && file.toString().contains(partOfName))
        {
           foundFiles.add(file);
        }
        else if(partOfContent != null)
            {
                try(Scanner scanner = new Scanner(file))
                {
                    while(scanner.hasNextLine())
                    {
                        String line = scanner.nextLine();
                        if(line.contains(partOfContent))
                        {
                            foundFiles.add(file);
                            break;
                        }
                    }
                }
            }
         else if(file.toFile().length() < maxSize)
         {
             foundFiles.add(file);
         }
         else if(file.toFile().length() > minSize)
         {
             foundFiles.add(file);
         }
        return super.visitFile(file, attrs);
    }
}

主要方法:

public static void main(String[] args) throws IOException
    {
        SearchFileVisitor searchFileVisitor = new SearchFileVisitor();

        searchFileVisitor.setPartOfName("John");
        searchFileVisitor.setPartOfContent("be or not to be?");
        searchFileVisitor.setMinSize(500);
        searchFileVisitor.setMaxSize(10000);

        Files.walkFileTree(Paths.get("D:/SecretFolder"), searchFileVisitor);

        List<Path> foundFiles = searchFileVisitor.getFoundFiles();
        for (Path file : foundFiles)
        {
            System.out.println(file);
        }
    }

所以,如果我只设置partOfName,它应该只中继它。但如果除此之外我还设置了partOfContent并说maxSize,那么到目前为止它应该同时传递3个参数。因此,如果有 4 个标准杆,如果该对象满足所有条件,则它应该中继四个标准杆并将其添加到列表中。我该怎么做?(没有该死的 boolean 标志)

最佳答案

您应该将每个参数的逻辑构造为“参数被禁用或文件通过参数检查”。

首先,使用默认值来指示参数已禁用:

private String partOfName = null;
private String partOfContent = null;
private int minSize = -1;
private int maxSize = -1;

然后您可以使用单个 if 语句,并在单独的方法中检查 partOfContent 以保持简单:

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    if ((partOfName == null || file.toString().contains(partOfName))
            && (partOfContent == null || fileContains(file, partOfContent))
            && (maxSize < 0 || file.toFile().length() < maxSize)
            && (minSize < 0 || file.toFile().length() > minSize)) {
        foundFiles.add(file);
    }
    return super.visitFile(file, attrs);
}

private static boolean fileContains(Path file, String partOfContent) throws IOException {
    try (Scanner scanner = new Scanner(file)) {
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.contains(partOfContent)) {
                return true;
            }
        }
    }
    return false;
}

关于java - 如何考虑方法中的少数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44377424/

相关文章:

表单加载时 Java GUI 绘制并填充矩形

java - Minecraft Forge 如何从外部 JAR 加载模组?

C--程序未正确读取文件结尾

java - 计算文件中的单词数

java - @Implementation 如何使用?

java - 如何为Android/Java实现多个事件

android - 在没有 SD 卡的应用程序之间共享临时文件

c - 二进制文件错误

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

Python3逐行读取混合文本/二进制数据