我试图调查一个DirecoryStream.Filter示例newDirectoryStream,我可以在其中列出超过60天的目录(及其所有子目录)下的所有文件,作为示例.
DirectoryStream<Path> dirS = Files.newDirectoryStream(Paths.get("C:/myRootDirectory"), <DirectoryStream.filter>);
for (Path entry: dirS) {
System.out.println(entry.toString());
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,应该是DirectoryStream.filter什么?
这将是一个很大的帮助,因为我正在一个项目,我试图删除早于某个时间戳和java-1.7 File.listFiles()之前的文件挂起.
可以Files.walkFileTree()提供一个选项吗?
如果我做对了,你有两种情况:
filter以选择超过60天的文件FileTree)并收集您的信息使用Calendar类实现60天的条件时,自定义过滤器更容易实现:
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
public boolean accept(Path entry) throws IOException {BasicFileAttributes attr = Files.readAttributes(entry,BasicFileAttributes.class);
FileTime creationTime = attr.creationTime();
Calendar cal = Calendar.getInstance();
int days = cal.fieldDifference(new Date(creationTime.toMillis()),Calendar.DAY_OF_YEAR);
return (Math.abs(days) > 60);
}
};
Run Code Online (Sandbox Code Playgroud)
正常执行只会查找根目录中的文件.要查找子目录,您对使用的猜测walkFileTree()是正确的.
但是,这需要一个FileVisitor接口的实现,一个简单的实现幸运地与7 - 捆绑在一起SimpleFileVisitor.
要遍历子目录,您可以选择覆盖特定于目录的方法 - 我preVisitDirectory在SimpleFileVisitor这里使用过:
Files.walkFileTree(dirs, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path file,
BasicFileAttributes attrs) {
Run Code Online (Sandbox Code Playgroud)
由于preVisitDirectory将自定义return FileVisitResult.CONTINUE;以防您没有任何其他限制,我们将利用preVisitDirectory方法在应用过滤器时一次遍历我们的目录1.
Files.walkFileTree(dirs, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path file,
BasicFileAttributes attrs) {
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
public boolean accept(Path entry) throws IOException {
BasicFileAttributes attr = Files.readAttributes(entry,
BasicFileAttributes.class);
FileTime creationTime = attr.creationTime();
Calendar cal = Calendar.getInstance();
int days = cal.fieldDifference(
new Date(creationTime.toMillis()),
Calendar.DAY_OF_YEAR);
return (Math.abs(days) > 60);
}
};
try (DirectoryStream<Path> stream = Files.newDirectoryStream(
file, filter)) {
for (Path path : stream) {
System.out.println(path.toString());
}
} catch (IOException ex) {
ex.printStackTrace();
}
return FileVisitResult.CONTINUE;
}
});
Run Code Online (Sandbox Code Playgroud)
这将为您提供整个目录和子目录结构中所需过滤条件的文件,完整的主要方法如下:
public static void main(String[] args) throws IOException {
Path dirs = Paths.get("C:/");
Files.walkFileTree(dirs, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path file,
BasicFileAttributes attrs) {
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
public boolean accept(Path entry) throws IOException {
BasicFileAttributes attr = Files.readAttributes(entry,
BasicFileAttributes.class);
FileTime creationTime = attr.creationTime();
Calendar cal = Calendar.getInstance();
int days = cal.fieldDifference(
new Date(creationTime.toMillis()),
Calendar.DAY_OF_YEAR);
return (Math.abs(days) > 60);
}
};
try (DirectoryStream<Path> stream = Files.newDirectoryStream(
file, filter)) {
for (Path path : stream) {
System.out.println(path.toString());
}
} catch (IOException ex) {
ex.printStackTrace();
}
return FileVisitResult.CONTINUE;
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10984 次 |
| 最近记录: |