为什么我收到此InvalidPathException

时间:2019-06-24 11:54:31

标签: java

此代码存在一些问题。即我收到消息:

  

线程“ main”中的异常java.nio.file.InvalidPathException:索引2处的非法char <:>:[E:\ Temp \ 564 \ 324 \ 123.txt]

public static void main(String[] args) throws Exception{
    Path sourseFile = Paths.get("E:\\Temp");
    Path[] result = searchFile(sourseFile, "123");
    for (Path path : result) {
        System.out.println(path);
    }        
}

public static Path[] searchFile (Path path, String fileName)throws Exception{

    DirectoryStream<Path> dirStream = Files.newDirectoryStream(path);
    ArrayList<Path> temp = new ArrayList<>();
    for (Path s : dirStream) {
        if (s.toFile().isDirectory()){
            temp.add(Paths.get(Arrays.toString(searchFile(s, fileName))));
        }
        else {
            if (s.toAbsolutePath().toString().contains(fileName)){
                temp.add(s.toAbsolutePath());
            }
        }
    }
    return temp.toArray(Path[]::new);
}

完整跟踪

  

线程“ main”中的异常java.nio.file.InvalidPathException:索引2处的非法char <:>:[E:\ Temp \ 564 \ 324 \ 123.txt]           在java.base / sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)           在java.base / sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)           在java.base / sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)           在java.base / sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)           在java.base / sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:229)           在java.base / java.nio.file.Path.of(Path.java:147)           在java.base / java.nio.file.Paths.get(Paths.java:69)           在s09.Task1.searchFile(Task1.java:28)           在s09.Task1.searchFile(Task1.java:28)           在s09.Task1.main(Task1.java:13)

3 个答案:

答案 0 :(得分:4)

似乎您正在将字符串“ [E:...]”(包括Arrays.toString添加的周围方括号)传递给Paths.get。然后,将其解释为纯文件名,其中“:”字符确实是非法的。

答案 1 :(得分:3)

我认为线索在异常消息中:

   Illegal char <:> at index 2: [E:\Temp\564\324\123.txt]

请注意,这是说非法字符位于索引2。

现在,Java对字符串和数组以及大多数其他事物使用基于零的索引。 1 。因此,如果:字符位于偏移量2处,则[字符必须是路径名的第一个字符;也就是说,实际的“路径名”是由"[E:\Temp\564\324\123.txt]"(包括方括号)组成的。

那是错的。

那是哪里来的?

 temp.add(Paths.get(Arrays.toString(searchFile(s, fileName))));

什么?

您正在某个数组上调用Arrays.toString,并期望它是有效的路径名。那是行不通的。在Arrays.toString()上阅读javadocs

为便于记录,这是一种将字符串数组连接成Path的简洁方法。

 String[] array = {"a", "b", "c"};
 Path p = Stream.of(array).map(Paths::get).reduce(Path::resolve).get();
 System.out.println(p);

1-在此异常消息中包括偏移量。我检查了源代码。

答案 2 :(得分:0)

添加了一些代码来替换[]

public static void main(String[] args) throws Exception{
            Path sourseFile = Paths.get("E:\\Temp");
            Path[] result = searchFile(sourseFile, "123");
            for (Path path : result) {
                System.out.println(path);
            }
        }

        public static Path[] searchFile (Path path, String fileName)throws Exception{

            DirectoryStream<Path> dirStream = Files.newDirectoryStream(path);
            ArrayList<Path> temp = new ArrayList<>();
            for (Path s : dirStream) {
                if (s.toFile().isDirectory()){
                    **temp.add(Paths.get(Arrays.toString(searchFile(s, fileName)).replaceAll("\\[", "").replaceAll("\\]","")));**
                }
                else {
                    if (s.toAbsolutePath().toString().contains(fileName)){
                        temp.add(s.toAbsolutePath());
                    }
                }
            }
            return temp.toArray(Path[]::new);
        }