代码之家  ›  专栏  ›  技术社区  ›  Tejal

读取文件使用Java文件

  •  5
  • Tejal  · 技术社区  · 6 年前

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

    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;
            }
        }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   davidxxx    6 年前

    你的 split() 是正确的,但你的 map() 当您同时收集目录和文件时,流中的似乎不正确。
    所以你没有收集期望值:那是 String XXX_XXX 模式。

    注意 MAP() 不是为过滤而设计的,而是为转换而设计的。
    使用 filter() 而不是使用它来只筛选文件:

    List<String> list = paths.filter(Files::isRegularFile)
                             .map(p -> p.getFileName()
                                        .toString())
                             .collect(Collectors.toList());
    
        2
  •  1
  •   Nikolas Charalambidis    6 年前

    问题是,不仅文件,目录本身也会进入流中。例子:

    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() && !isDirectory() && !isOther(); .