我有一个装满文本文件的目录。这些文件的命名约定是 {用户名} + {年份之日}
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
}
}
}