如何在目录中搜索以字符串开头的文件



我有一个装满文本文件的目录。这些文件的命名约定是 {用户名} + {年份之日}

SuperMan201
JamesBond056
JamesBond101
JamesBond093
JamesBondImposter004
SuperMan051
JamesBond057
JamesBond004

我想在我的文件中搜索以詹姆斯邦德开头的文件。我怎样才能获得以詹姆斯邦德开头的文本文件的第一个实例,而不是获得与我的搜索匹配的詹姆斯邦德冒名顶替者。

我有一个 LinkedHashSet 用于存储目录中有文本文件的用户的用户名。本质上,我想获取 JamesBond 文本文件的第一个实例读取该文件,将文件移动到另一个目录,然后读取后续文件(如果存在);然后转到链接列表中的下一个用户名。

如果你想从目录中选择文件,看看 https://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles(java.io.FileFilter)和 https://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles(java.io.FilenameFilter) - 只需编写与你想要的相匹配的过滤器

使用 Apache commons-io (listFiles 和 iterateFiles 方法)。通常代码如下所示:

File dir = new File(".");
FileFilter fileFilter = new WildcardFileFilter("James*");
File[] files = dir.listFiles(fileFilter);
if(files!=null && files.length > 0)
{
 your desired file is files[0]
}

如果你使用的是Java 8,你可以这样做:

Path dir = Paths.get(fullPathOfDirectory);
Stream<Path> jamesBondFiles = Files.list(dir).filter(path ->
    path.getFileName().toString().matches("JamesBond\d+"));
Iterator<Path> i = jamesBondFiles.iterator();
while (i.hasNext()) {
    Path file = i.next();
    try (BufferedReader reader = Files.newBufferedReader(file)) {
        // Read and process file
    }
}

如果您使用的是 Java 7,或者不想使用 Stream,您可以执行以下操作:

Path dir = Paths.get(fullPathOfDirectory);
final PathMatcher matcher =
    dir.getFileSystem().getPathMatcher("regex:JamesBond\d+");
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
    @Override
    public boolean accept(Path path) {
        return matcher.matches(path.getFileName());
    }
};
try (DirectoryStream<Path> ds = Files.newDirectoryStream(dir, filter)) {
    Charset charset = Charset.defaultCharset();
    for (Path file : ds) {
        try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
            // Read and process file
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新