2016-04-27 13 views
0

おはよう、JARファイルにアクセス中にNotDirectoryExceptionが発生しました

* .classファイルを2つ含むJARファイルに動的にアクセスしようとしています。 私はそれについて読んだことがあります。良い方法は、javaクラスのFileSystemを使ってjarファイル内のいくつかのファイルにアクセスすることです。私は、次のコードを書いてきました:

private void loadJar(String gameName) { 
     final String packageBinaryName = gameName; 
     final String pathname = packageBinaryName.replace(".", "/") +".jar"; 
     URI uri = null; 
     uri = new File(pathname).toURI();//.toURL(); 
     final String[] array = uri.toString().split("!"); 
     FileSystem fs = null; 
     Path dir; 

     try 
     { 
      if(array.length == 2) 
      { 
       final Map<String, String> env = new HashMap<>(); 
       fs = FileSystems.newFileSystem(URI.create(array[0]), env); 
       dir = fs.getPath(array[1]); 
      } 
      else 
       dir = Paths.get(uri); 

      DirectoryStream<Path> stream; 

      System.out.println(dir); 
      stream = Files.newDirectoryStream(dir, "*.class"); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
} 

をしかし、私はJARファイルが存在し、それが書き込みパスを指すjava.nio.file.NotDirectoryException

を取得します。この問題の原因は何ですか?

dirが次のように出力されます

C:\Users\afonso\workspace\GameEvaluatorDummy\src\TicTacToe.jar 

EDIT:else文には、dir文はその値を取得します。もちろん、

dir=Paths.get(uri); 

答えて

1

をデバッグすることは、それが他のパスになることに注意してください。
確認しているURIに感嘆符が含まれることはありません。
しかし、単純にJARファイルのURIになります。
感嘆符を付けてこのメソッドにパラメータを渡す以外は、これはうまくいかないでしょう。

あなたが後にしていること

FileSystem fs = FileSystems.newFileSystem(new URI("jar:file:///path/to/the.jar"), Collections.<String,?>emptyMap()); 
Path dir = fs.getPath("/"); 
Files.newDirectoryStream(dir, "*.class*); 

である。しかし、これは自動的にサブディレクトリに再帰的にしないことに注意してください。

+0

あなたはexcalmationマークについては正しいですが、JARにアクセスする際に発生するエラーについては違いがありますか? –

+0

まあ、JARファイルはファイルであり、ディレクトリではありません。 – Vampire

+0

Paths.get()へのjar-URLを代わりに与えると動作するかもしれません。 'jar:path/to/jar!/'を正しく考えていればそれです。 – Vampire

関連する問題