Почему я получаю это InvalidPathException - PullRequest
6 голосов
/ 24 июня 2019

Возникли проблемы с этим кодом.А именно, я получаю сообщение:

Исключение в потоке "main" java.nio.file.InvalidPathException: недопустимый символ <:> в индексе 2: [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: [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 ]

4 голосов
/ 24 июня 2019

Похоже, что вы передаете строку "[E: ...]", включая окружающие квадратные скобки, добавленные Arrays.toString, в Paths.get.Это тогда интерпретируется как простое имя файла, в котором символ ":" действительно недопустим.

3 голосов
/ 24 июня 2019

Я думаю, что ключ находится в сообщении об исключении:

   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 для некоторого массива и ожидаете, что это будет допустимое имя пути. Ни за что это не сработает. Прочитайте javadocs для Arrays.toString().

Для справки, вот краткий способ объединить массив строк в Path.

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

1 - Включает смещение в этом сообщении об исключении. Я проверил исходный код.

0 голосов
/ 25 июня 2019

Добавлен код для замены []

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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...