我需要使用以下选项/参数在Java中开发文件扫描器:
>一个目录
>一种或多种模式,例如* .xml,*.txt,* test.csv
>递归扫描开关
我认为最好的方法是这样的:
public class FileScanningTest {
public static void main(String[] args) throws IOException {
String directory = "C:\\tmp\\scanning\\";
String glob = "**/*.xml";
Boolean rekursiv = false;
final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:"+glob);
Files.walkFileTree(Paths.get(directory), new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
if (pathMatcher.matches(path)) {
System.out.println(path);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
}
}
我不明白为什么我必须在实际模式前加上“ ** /”.而且这确实使扫描递归.如果删除** /,则该应用程序找不到任何内容.
有人可以给我提示吗?
谢谢大家,周末愉快
解决方法:
要使用从目录/ tmp / scanning /开始的glob递归查找* .xml,请查看此示例.它可以与Linux Ubuntu一起使用,并且可以满足您的需求.它的工作方式类似于Unix find实用程序.我没有在Ubuntu以外的其他操作系统上对其进行测试,但是您只需要更改文件名分隔符即可.
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
import static java.nio.file.FileVisitResult.*;
import static java.nio.file.FileVisitOption.*;
import java.util.*;
public class FileScanningTest {
public static class Finder
extends SimpleFileVisitor {
private final PathMatcher matcher;
private int numMatches = 0;
Finder(String pattern) {
matcher = FileSystems.getDefault()
.getPathMatcher("glob:" + pattern);
}
// Compares the glob pattern against
// the file or directory name.
void find(Path file) {
Path name = file.getFileName();
if (name != null && matcher.matches(name)) {
numMatches++;
System.out.println(file);
}
}
// Prints the total number of
// matches to standard out.
void done() {
System.out.println("Matched: "
+ numMatches);
}
// Invoke the pattern matching
// method on each file.
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) {
find(file);
return CONTINUE;
}
// Invoke the pattern matching
// method on each directory.
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) {
find(dir);
return CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file,
IOException exc) {
System.err.println(exc);
return CONTINUE;
}
}
public static void main(String[] args)
throws IOException {
boolean recursive = false;
Path startingDir = Paths.get("/tmp/scanning");
String pattern = "*.{html,xml}";
Finder finder = new Finder(pattern);
if (!recursive) {
Path dir = startingDir;
List files = new ArrayList<>();
try (DirectoryStream stream = Files.newDirectoryStream(dir, "*.{xml,html}")) {
for (Path entry : stream) {
files.add(entry.toFile());
}
for (File xmlfile : files) {
System.out.println(xmlfile);
}
} catch (IOException x) {
throw new RuntimeException(String.format("error reading folder %s: %s",
dir,
x.getMessage()),
x);
}
} else {
Files.walkFileTree(startingDir, finder);
finder.done();
}
}
}
测试
~> java FileScanningTest
/tmp/scanning/dir2/test2.xml
/tmp/scanning/blah.xml
Matched: 2
如果要匹配* .xml或test3.html,则可以使用以下模式:字符串模式=“ {* .xml,test3.html}”;
标签:glob,java
来源: https://codeday.me/bug/20191118/2026459.html