【问题标题】:Read file using Java nio files walk()使用 Java nio 文件 walk() 读取文件
【发布时间】:2018-12-25 00:21:43
【问题描述】:

我正在使用流 API 读取文件我正在调用 readFile() 方法,同时在第一个循环中迭代循环我正在获取路径值如何删除该路径值,因为我面临数组索引越界异常。 文件命名转换为“FileName_17072018”。

public class RemoveCVVFilesjob {

    public static void main(String[] args) throws IOException {
        List<String> fileList;
        fileList = readFile();

        for (String str : fileList) {
            String[] strArr = str.split("_");
            System.out.println(strArr[1]);
        }
    }

    private static List<String> readFile() throws IOException {

        try (Stream<Path> paths = Files.walk(Paths.get("D:\\Projects\\Wallet\\CVVFiles"))) {

            List<String> list = paths.map(path -> Files.isDirectory(path) ? 
                path.getFileName().toString() + '/' : 
                path.getFileName().toString()).collect(Collectors.toList()
            );
            return list;
        }
    }

【问题讨论】:

  • 如果您需要文件路径,请使用过滤器检查是否是文件,如果文件则收集它。并且不确定您的所有文件都遵循 xxx_xxxx 模式。
  • @mallikarjun 在第一次迭代中调用 readfile 方法后我正在获取文件路径,从第二次迭代中我正在获取文件名,那么我应该如何在第一次迭代中避免文件路径

标签: java list file java-8 java-stream


【解决方案1】:

问题在于,不仅文件而且目录本身都进入了 Stream。示例:

D:\Projects\Wallet\CVVFiles
D:\Projects\Wallet\CVVFiles\FileName_17072018.txt
D:\Projects\Wallet\CVVFiles\FileName_18072018.txt

没有过滤器,映射的结果是:

[CVVFiles, FileName_17072018.txt, FileName_18072018.txt]

然后它无法通过分隔符_ 在第一项(即目录)上获取拆分结果数组的第二个元素。过滤掉目录以使其工作:

List<String> list = paths
    .filter(Files::isRegularFile)
    .map(path -> path.getFileName().toString())
    .collect(Collectors.toList());

您可能会发现有趣的paths.peek(System.out::println).map...,以了解进入map 管道的内容。


我建议你使用Files::isRegularFile,它和!isSymbolicLink() &amp;&amp; !isDirectory() &amp;&amp; !isOther();完全一样。

【讨论】:

    【解决方案2】:

    您的split() 是正确的,但您在流中的map() 似乎不正确,因为您收集了目录和文件。
    所以你没有收集到预期值:即StringXXX_XXX 模式。

    请注意,map() 的设计目的不是过滤而是转换。
    使用filter() 而不是只过滤文件:

    List<String> list = paths.filter(Files::isRegularFile)
                             .map(p -> p.getFileName()
                                        .toString())
                             .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多