我有一个充满文本文件的目录。这些文件的命名约定是{userName} + {dayOfYear}
SuperMan201
JamesBond056
JamesBond101
JamesBond093
JamesBondImposter004
SuperMan051
JamesBond057
JamesBond004
我想在我的文件中搜索以Jamesbond开头的文件。如何获取以Jamesbond开头的文本文件的第一个实例,而不是让JamesBondImposter与我的搜索匹配。
我有一个LinkedHashSet,用于存储目录中包含文本文件的用户的用户名。基本上我想让JamesBond文本文件的第一个实例读取文件,将文件移动到另一个目录,然后读取后续文件(如果存在);然后转到LinkedList中的下一个用户名。
答案 0 :(得分:2)
如果您想从目录中选择文件,请查看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) - 只需编写符合您需要的过滤条件
答案 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
}
}
}