web-dev-qa-db-fra.com

Exception dans le thread "principal" Java.nio.file.InvalidPathException: caractère illégal <:> à l'index 2:

Je dois copier la ressource classpath d'un package à un autre.

Mon programme est:

    public static void main(String[] args) throws IOException, URISyntaxException {

            ClassLoader classLoader = CopyFileToDirectoryTest.class.getClassLoader();
InputStream in = classLoader.getResourceAsStream("com/stackoverflow/main/Movie.class");

            URI uri = ClassLoader.getSystemResource("com/stackoverflow/json").toURI();
            Path path = Paths.get(uri.getPath(),"Movie.class");
            System.out.println(path);

            long copy = Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
            System.out.println(copy);

        }

À Files.copy méthode j'obtiens une exception:

Exception in thread "main" Java.nio.file.InvalidPathException: Illegal char <:> at index 2: /D:/Programs/workspaceEE/HibernateDemo/target/classes/com/stackoverflow/json
    at Sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.Java:182)
    at Sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.Java:153)
    at Sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.Java:77)
    at Sun.nio.fs.WindowsPath.parse(WindowsPath.Java:94)
    at Sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.Java:255)
    at Java.nio.file.Paths.get(Paths.Java:84)
    at com.stackoverflow.main.CopyFileToDirectoryTest.main(CopyFileToDirectoryTest.Java:34)

Comment le résoudre?

Solution

public static void main(String[] args) throws IOException, URISyntaxException {
        ClassLoader classLoader = CopyFileToDirectoryTest.class.getClassLoader();
        InputStream in = classLoader.getResourceAsStream("com//stackoverflow//main//Movie.class");
        URI uri = ClassLoader.getSystemResource("com//stackoverflow//json").toURI();
        String mainPath = Paths.get(uri).toString();
        Path path = Paths.get(mainPath, "Movie.class");
        System.out.println(path);
        long copy = Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
        System.out.println(copy);
    }

Ce code copie correctement Movie.class du package com/stackoverflow/main en com/stackoverflow/json.

13
Jay Smith

le problème est que Paths.get() ne s'attend pas à ce type de valeur qui est généré à partir de uri.getPath().

Solution:

URI uri = ClassLoader.getSystemResource("com/stackoverflow/json").toURI();
String mainPath = Paths.get(uri).toString();
Path path = Paths.get(mainPath ,"Movie.class");
20
hunter

J'ai eu le même problème et j'ai obtenu l'exception, j'ai remarqué qu'il y avait un espace dans le nom de fichier, j'ai donc dû le couper. Après cela, le problème est résolu.

Path filePath = Paths.get(dirPathStr, newFileName.trim());
3
techguy

Essaye ça:

Path path = new File(getClass().getResource("/<path to the image in your build/classes folder>").getFile()).toPath();

pour obtenir le bon chemin. A travaillé pour moi après plusieurs heures à essayer de découvrir pourquoi je ne pouvais pas obtenir le fichier du pot. Cela fonctionne pour NetBeans 8.02

0
Fego

J'ai le même problème que j'éliminais depuis deux jours et finalement, je l'ai compris L'espace provoque un tel problème, essayez de le résoudre

var fileName=YourFileName.trim();
Path filePath = Paths.get(dirPathStr, fileName);
0
SUDIP SINGH