StringBuilder 拆分不适用于某些文件

问题描述

我正在尝试获取每个文件的父目录并将其放入 Java fx 中的 ListView。

它确实有效,但对某些文件名无效,我不明白为什么。

Iterator<String> listIterator = loadedFiles.iterator();
    StringBuilder listItem = null;
    while (listIterator.hasNext()) {

        File listFile = new File(listIterator.next());

        listItem = new StringBuilder(Arrays.toString(listFile.getAbsolutePath().split(listFile.getName())));
        toDir(listItem);
        ctrl.fileList.getItems().add(listItem.toString());
    }

获取文件路径,并截取文件名。

到目录:

private void toDir(StringBuilder builder) {
    builder.deleteCharat(builder.length() - 1);
    builder.deleteCharat(0);
    if (builder.charat(builder.length() - 1) == '\\') {
        builder.deleteCharat(builder.length() - 1);
    }
}

删除数组括号和最后一个'\'

给定的文件路径是:

C:\Users\Test\Downloads\048815 - Kopie (2).jpg

C:\Users\Test\Downloads\048815 - Kopie (3).jpg

C:\Users\Test\Downloads\048815 - Kopie (4).jpg

C:\Users\Test\Downloads\048815 - Kopie.jpg

C:\Users\Test\Downloads\048815.jpg

一个文件,名字中带 () 的文件不起作用,文件名仍然在 String 中并添加到列表中,只有最后两个文件名被删除

解决方法

您当前的问题是您滥用了 String#split()split() 的参数是一个正则表达式,其中括号是对元字符进行分组。您根本不想在这里使用 split()。事实上,您最好使用 java.nio.file.Path 中的路径操作方法。

for (String fileName : loadedFiles)
{
    Path filePath = Path.of(fileName);
    Path directory = filePath.getParent();
    ctrl.fileList.getItems().add(directory.toString());
}

一旦您对 API 感到满意,您就可以将其减少到

for (String fileName : loadedFiles)
{
    ctrl.fileList.getItems().add(Path.of(filename).getParent().toString());
}