【问题标题】:list the filenames without showing the parent path列出文件名而不显示父路径
【发布时间】:2017-12-19 00:50:31
【问题描述】:

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

    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:\Users\sd\Desktop\sdsd\TagCategory\healthoutcomes_queries\Neurological.txt

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

TagCategory\healthoutcomes_queries\Neurological.txt

我该怎么做。

【问题讨论】:

  • 您有什么理由选择使用原始(非泛型)类吗?我的意思是现在是 2017 年,而不是 2001 年。
  • 我并不是想让它们成为非通用的。我只是匆忙复制粘贴。我已经在我的代码中修复了它。

标签: java


【解决方案1】:

使用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&lt;File&gt;,并且使用“增强的 for 循环”循环遍历迭代器的现代习惯用法更易于阅读:

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

【讨论】:

  • 这比使用substring()干净得多
  • 你有什么理由使用Paths.get(file.toURI())而不是file.toPath()
  • 忍不住:files.stream().map( f -&gt; f.toPath()).map(parentPath::relativeize).forEach(f -&gt; System.out.println("File = " + f));
  • @DodgyCodeException 没有充分的理由。调用toURI() 可能是个坏习惯。感谢您的反馈。我编辑了。这样更干净。
【解决方案2】:

只需添加子字符串:

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

【讨论】:

    【解决方案3】:

    您可以使用 substring 命令获取该值,如下所示..

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

    fileIter.getPath().substring(25);
    

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

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

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

    【讨论】:

      【解决方案4】:

      使用旧的第三方库使代码复杂化有什么意义?只需使用纯 Java:它的作用与您的多行方法完全相同:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 2022-07-15
        • 2021-01-20
        • 2018-06-25
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        相关资源
        最近更新 更多