[英]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.