列出文件名而不显示父路径

时间:2017-12-18 16:02:11

标签: java

我列出了给定目录中的所有文件名(递归)。这包括在子目录中显示文件名。

    File file = new File(FILE_PATH);
    // Recursively search for all the resource files.
    Collection files = FileUtils.listFiles(file, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (Iterator iterator = files.iterator(); iterator.hasNext();)
    {
        File fileIter = (File) iterator.next();
        System.out.println("File = " + fileIter.getPath());

    }

其中File是父目录(" C:\ Users \ sd \ Desktop \ sdsd) 现在上面的代码工作文件并列出该目录和子目录中的所有文件,如

  

C:\用户\ SD \桌面\ sdsd \ TagCategory \ healthoutcomes_queries \ Neurological.txt

但我想只显示(父路径内的路径)

  

TagCategory \ healthoutcomes_queries \ Neurological.txt

我该怎么做。

4 个答案:

答案 0 :(得分:5)

使用Path.relativize()

  

构造此路径与给定路径之间的相对路径。

     

相对化是决议的反过来。这种方法试图   构造一个相对路径,当相对于此路径求解时,产生   与给定路径定位同一文件的路径。例如,开启   UNIX,如果此路径为“/ a / b”且给定路径为“/ a / b / c / d”,则为   结果相对路径为“c / d”。

因此,您只需要通过调用parentPath.relativize(filePath)从父路径创建相对路径,并为每个文件执行此操作:

Path parentPath = Paths.get(FILE_PATH);

for (Iterator<File> iterator = files.iterator(); iterator.hasNext();){     
    Path filePath = iterator.next().toPath();
    Path relativePath = parentPath.relativize(filePath);
    System.out.println("File = " + relativePath );  
}

请注意,您应该使用泛型集合来避免强制转换:Collection<File>,并且使用“增强for循环”循环遍历迭代器的现代习惯用法更清晰:

for (File file : files) {     
    System.out.println("File = " +
         parentPath.relativize(file.toPath()));  
}

答案 1 :(得分:1)

只需添加子字符串:

fileIter.getPath().substring(file.length())

答案 2 :(得分:0)

您可以使用substring命令根据以下内容获取该值。

如果该父目录的长度保持不变,那么它只是

fileIter.getPath().substring(25);

这将获取字符串中第25个字符后的所有字符,如果您想省略.txt,例如您可以指定子字符串将结束的位置,则下面的总长度为3。

fileIter.getPath().substring(25, fileIter.getPath().length() - 3);

有关子字符串方法的更多详细信息,请参阅https://beginnersbook.com/2013/12/java-string-substring-method-example/

答案 3 :(得分:0)

使用旧的第三方库使代码复杂化的重点是什么?只需使用普通Java:它与您的多行方法完全相同:

Path root = Paths.get(FILE_PATH);
Files.walk(root).forEach(path -> System.out.println("File = " + root.relativize(path)));