web-dev-qa-db-ja.com

スレッド「メイン」の例外Java.nio.file.InvalidPathException:インデックス2の文字<:>が無効です。

クラスパスリソースをあるパッケージから別のパッケージにコピーする必要があります。

私のプログラムは:

    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メソッドで例外が発生します:

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)

解決方法は?

ソリューション

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);
    }

このコードは、Movie.classをパッケージcom/stackoverflow/mainからcom/stackoverflow/jsonに正しくコピーします。

13
Jay Smith

問題は、Paths.get()uri.getPath()から生成される値の種類を期待していないことです。

解決:

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

同じ問題が発生し、例外が発生しましたが、ファイル名にスペースが含まれていることに気づいたので、トリミングする必要がありました。その後、問題は解決されます。

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

これを試して:

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

正しいパスを取得します。 jarからファイルを取得できなかった理由を見つけようとして、数時間後に私のために働きました。これはNetBeans 8.02で機能します

0
Fego

私は過去2日間でフェージングしていたのと同じ問題を抱えており、最終的には解決しました

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