2016-04-27 6 views
0

Guten Abend acessing,NotDirectoryException während einer JAR-Datei

Ich versuche, eine JAR-Datei für den Zugriff auf dynamisch enthält, dass ein paar * .class-Dateien. Ich habe darüber gelesen, und eine gute Möglichkeit ist, die Java-Klasse FileSystem zu verwenden, um auf mehrere Dateien im Jar zuzugreifen. Ich habe schrieb den folgenden Code:

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

Aber ich bekomme eine java.nio.file.NotDirectoryException

Die JAR-Datei vorhanden ist, und es verweist auf den Schreibpfad. Was könnte dieses Problem verursachen?

Die dir druckt die folgenden:

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

EDIT: Beachten Sie, dass die Anweisung dir Debuggen seinen Wert auf die else-Anweisung wird

dir=Paths.get(uri); 

Antwort

1

Natürlich wird es auf den anderen Weg.
Der URI, den Sie überprüfen, enthält niemals ein Ausrufezeichen.
Aber einfach die URI zu der JAR-Datei sein.
Außer du gibst als Parameter dieser Methode etwas mit Ausrufezeichen, aber das würde auch nicht funktionieren, würde ich sagen.

Was sind Sie nach ist

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

aber bewusst sein, dass diese nicht automatisch in die Unterverzeichnisse rekursiv.

+0

Sie haben Recht mit der Exmazulierungsmarke, aber das macht einen Unterschied bei dem Fehler, der beim Zugriff auf die JAR auftritt? –

+0

Nun, eine JAR-Datei ist eine Datei, kein Verzeichnis. – Vampire

+0

Vielleicht funktioniert es, wenn Sie stattdessen eine jars-URL zu Paths.get() geben. 'jar: pfad/zu/jar! /' wenn ich es richtig verstanden habe. – Vampire

Verwandte Themen