使用java.nio.file *的目录和文件扫描器;

时间:2019-01-08 11:42:41

标签: java path nio

如何在java.io.File中实现相同的功能;

List<File> List = (List<File>) FileUtils.listFilesAndDirs(directory, 
                                    TrueFileFilter.TRUE, TrueFileFilter.TRUE);
String fileID = f.getAbsolutePath().replaceAll(staticRoot, "");

重构为java.nio.file。*;

DirectoryStream<Path> List = Files.newDirectoryStream(Paths.get(directory));    
String fileID = f.??? 

哪种方法将返回与java.io.File包相同的输出? 谢谢。

我尝试过

String fileID = f.toAbsolutePath().toString().replaceAll(staticRoot, "");

for (Path f : fList) {
    String fileID = f.toAbsolutePath().toString().replaceAll(staticRoot, "");
    System.out.println("file ID : " + fileID);
    String parentID = null;
}

staticRoot = /home/test/dir1/dir10/test9.txt
结果应剪切为“ / home / test /”,并仅返回dir1 / dir10 / test9.txt

2 个答案:

答案 0 :(得分:1)

由于FileUtils.listFilesAndDirs(directory, TrueFileFilter.TRUE, TrueFileFilter.TRUE)将递归访问directory中的所有子目录,因此您很可能希望用Files.walk(Path, FileVisitOption...)方法将其替换。

  

通过遍历以给定起始文件为根的文件树,返回用Path懒散填充的Stream。文件树是深度优先遍历的,流中的元素是Path对象,就像通过相对于start解析相对路径获得的一样。

答案 1 :(得分:0)

给出一个表示/home/test/dir1/dir10/test9.txt的j.n.f.Path对象,调用.getParent()表示dir10。然后,如果您有一个表示/home/test/dir1/dir10/subdir1/subdir2/foo.txt的路径,并且想将其转换为subdir1/subdir2/foo.txt,则可以使用j.f.Path的relativize方法来实现。不需要replace或replaceAll。

注意:您使用的replaceAll错误。 replaceAll将正则表达式作为第一个参数,将替换项作为第二个参数,并替换该正则表达式上的所有匹配项。 replace方法将字符串作为参数,将替换项作为第二个参数,并且..也将替换全部。鉴于您的staticRoot不是正则表达式,因此您使用了错误的调用。只是下一次课程。是的,名称令人困惑。