我的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命令?
您可以使用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();
}
}
}
如果你想要做的不便与目录,使用preVisitDirectory
和postVisitDirectory
方法之前做的不便和后您访问的目录。