簡體   English   中英

使用Java nio文件walk()讀取文件

[英]Read file using Java nio files walk()

我正在使用流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;
        }
    }

您的split()是正確的,但是當您收集目錄和文件時,流中的map()似乎不正確。
所以你沒有收集預期的值:那是帶有XXX_XXX模式的String

請注意, map()不是為了過濾而是為了變換而設計的。
使用filter()代替並使用它來僅過濾文件:

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

問題是不僅文件而且目錄本身進入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() && !isDirectory() && !isOther();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM