クラスパスリソースをあるパッケージから別のパッケージにコピーする必要があります。
私のプログラムは:
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
に正しくコピーします。
問題は、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");
同じ問題が発生し、例外が発生しましたが、ファイル名にスペースが含まれていることに気づいたので、トリミングする必要がありました。その後、問題は解決されます。
Path filePath = Paths.get(dirPathStr, newFileName.trim());
これを試して:
Path path = new File(getClass().getResource("/<path to the image in your build/classes folder>").getFile()).toPath();
正しいパスを取得します。 jarからファイルを取得できなかった理由を見つけようとして、数時間後に私のために働きました。これはNetBeans 8.02で機能します
私は過去2日間でフェージングしていたのと同じ問題を抱えており、最終的には解決しました
var fileName=YourFileName.trim();
Path filePath = Paths.get(dirPathStr, fileName);