java全球_java-全球了解

我需要使用以下选项/参数在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值