我列出了给定目录中的所有文件名(递归)。这包括在子目录中显示文件名。
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
我该怎么做。
答案 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)));