2017-05-15 165 views
3

あるパッケージから別のパッケージにクラスパスリソースをコピーする必要があります。スレッド "main"の例外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) 

はどのようにそれを解決するために?パッケージcom/stackoverflow/mainから

ソリューション

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.classcom/stackoverflow/jsonに。

+0

クラスパスが 'jar'のような**透過的なリソースと**不透明な**リソースで構成されているため、これは動作しません。あなたは 'jar:file:/ com/stackoverflow/json'のようなパスに書き込もうとしています。これは無効な' Path'や 'File'で有効なURIです。一般的に、クラスパスには書き込むことができず、クラスパスからの読み取りだけができます。 –

+0

プロジェクトが作成されていません –

+0

Mavenプロジェクトをコンパイルすると、jarファイルが生成されます。コンパイルされたコードを他にどのように配布しますか? (Pre Java 9) –

答えて

2

問題は、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"); 
0

///に変更してください。これで問題は解決します。

"com/stackoverflow/main/Movie.class"

"com//stackoverflow//json"から"com/stackoverflow/json"など"com//stackoverflow//main//Movie.class"へ。

+2

'/ D:/ Programs/workspaceEE/HibernateDemo/target/classes/com // stackoverflow // json \ Movie.class'と同じパスを返します。しかし、私は最初に '/'を明示的に削除し、すべての '/'を '//'で置き換えました。これをPaths.getの引数として渡して動作させます! –

+2

これはなぜ違いがありますか?私はあなたがWindowsの '\\'パス区切りを考えていると仮定します。 –

+1

私は窓にいます –

0

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

パスfilePath = Paths.get(dirPathStr、newFileName.trim());

関連する問題