我有自己的 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/