我的linux服务器有一个目录,其中包含许多其他子目录,其中包含以关键字命名的文件。例如:
Dir1:
-Dir1.1:
-file-keyword11-keyword7-keyword9.txt
-file-keyword2-keyword7-keyword97.txt
-Dir1.2:
-file-keyword4-keyword6-keyword9.txt
-file-keyword2-keyword8-keyword3.txt
Dir2:
-Dir2.1:
-file-keyword5-keyword42-keyword2.txt
-file-keyword8-keyword11-keyword9.txt
我需要创建一个方法,该方法返回包含两个关键字之一的所有文件的列表。例如:
findFiles("keyword11", "keyword42");
应返回上一个示例的以下文件:
-file-keyword11-keyword7-keyword9.txt
-file-keyword5-keyword42-keyword2.txt
-file-keyword8-keyword11-keyword9.txt
我正在考虑创建一个递归方法,测试每个文件的名称是否包含两个关键字之一。但我担心性能,因为目录有数千个文件和子目录。每天都会创建越来越多的文件。
我想知道什么是正确的方法。我应该使用file.getName().contains()
方法吗?我应该使用正则表达式吗?或者我应该使用像grep这样的linux命令吗?
答案 0 :(得分:1)
你可以使用FileVisitor,非常方便。
以下是示例:
public class FileVisitorTest {
@Test
public void test() throws Exception {
String path = "D:\\downloads\\";
findFiles(path,"apache", "Test");
}
public void findFiles(String path, String... keyWords) {
try {
Files.walkFileTree(Paths.get(path), new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes fileAttributes) {
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFile(Path path, BasicFileAttributes fileAttributes) {
for (String keyWord : keyWords) {
if (path.getFileName() != null && path.getFileName().toFile().getName().contains(keyWord))
System.out.println("File name:" + path.getFileName());
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果您想对目录执行smth,请在访问目录之前和之后使用preVisitDirectory
和postVisitDirectory
方法执行smth。