如何搜索以String开头的目录中的文件

时间:2014-11-20 13:59:42

标签: java file file-io linked-list

我有一个充满文本文件的目录。这些文件的命名约定是{userName} + {dayOfYear}

SuperMan201
JamesBond056
JamesBond101
JamesBond093
JamesBondImposter004
SuperMan051
JamesBond057
JamesBond004

我想在我的文件中搜索以Jamesbond开头的文件。如何获取以Jamesbond开头的文本文件的第一个实例,而不是让JamesBondImposter与我的搜索匹配。

我有一个LinkedHashSet,用于存储目录中包含文本文件的用户的用户名。基本上我想让JamesBond文本文件的第一个实例读取文件,将文件移动到另一个目录,然后读取后续文件(如果存在);然后转到LinkedList中的下一个用户名。

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

使用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]
}

答案 2 :(得分: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
        }
    }
}