2013-07-19 12 views
5

Ho un .jar che ha due file .dll da cui dipende. Mi piacerebbe sapere se c'è un modo per me di copiare questi file da .jar a una cartella temporanea degli utenti in fase di esecuzione. ecco il codice corrente che ho (a cura di un solo carico dll per ridurre le dimensioni domanda):Come copiare i file dal contenitore attualmente in esecuzione

public String tempDir = System.getProperty("java.io.tmpdir"); 
public String workingDir = dllInstall.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 

public boolean installDLL() throws UnsupportedEncodingException { 

try { 
      String decodedPath = URLDecoder.decode(workingDir, "UTF-8"); 
      InputStream fileInStream = null; 
      OutputStream fileOutStream = null; 

      File fileIn = new File(decodedPath + "\\loadAtRuntime.dll"); 
      File fileOut = new File(tempDir + "loadAtRuntime.dll"); 

      fileInStream = new FileInputStream(fileIn); 
      fileOutStream = new FileOutputStream(fileOut); 

      byte[] bufferJNI = new byte[8192000013370000]; 
      int lengthFileIn; 

      while ((lengthFileIn = fileInStream.read(bufferJNI)) > 0) { 
       fileOutStream.write(bufferJNI, 0, lengthFileIn); 
      } 

      //close all steams 
     } catch (IOException e) { 
     e.printStackTrace(); 
      return false; 
     } catch (UnsupportedEncodingException e) { 
      System.out.println(e); 
       return false; 
     } 

Il mio problema principale è ottenere i file dll fuori dal vaso in fase di esecuzione. Sarebbe utile trovare un modo per recuperare il percorso dall'interno di .jar.

Grazie in anticipo.

+0

Si desidera ottenere percorsi di file .dll arround – user217895

+0

Sì, solo così posso accedere ai file e copiarli. Tutto ciò di cui ho bisogno sono i percorsi di classe. So già come copiare i file. – DeanMWake

risposta

8

Poiché le tue DLL sono raggruppate all'interno del tuo file jar, potresti semplicemente provare ad analizzarle come risorse usando ClassLoader#getResourceAsStream e scriverle come file binari dove vuoi sul disco rigido.

Ecco alcuni esempi di codice:

InputStream ddlStream = <SomeClassInsideTheSameJar>.class 
    .getClassLoader().getResourceAsStream("some/pack/age/somelib.dll"); 

try (FileOutputStream fos = new FileOutputStream("somelib.dll");){ 
    byte[] buf = new byte[2048]; 
    int r; 
    while(-1 != (r = ddlStream.read(buf))) { 
     fos.write(buf, 0, r); 
    } 
} 

Il codice qui sopra estrarre il dll si trova nella confezione some.pack.age alla directory di lavoro corrente.

+0

+1 per il codice di esempio. Grazie. Ora funziona perfettamente con un piccolo ritocco. – DeanMWake

+0

@MethodMan Benvenuto! – A4L

+0

Penso tu voglia dire: Sei *;) – DeanMWake

0

Utilizzare myClass.getClassLoader().getResourceAsStream("loadAtRuntime.dll"); e sarà possibile trovare e copiare DLL nel JAR. Dovresti scegliere una classe che sarà nello stesso JAR.

0

Utilizzare un programma di caricamento classe in grado di individuare le risorse in questo file JAR. O puoi usare il caricatore di classi di una classe come suggerito da Peter Lawrey, oppure puoi anche creare uno URLClassLoader con l'URL di quel JAR.

Una volta ottenuto questo caricatore di classe, è possibile recuperare un flusso di input di byte con ClassLoader.getResourceAsStream. D'altra parte basta creare uno FileOutputStream per il file che si desidera creare.

L'ultimo passaggio è quindi copiare tutti i byte dal flusso di input al flusso di output, come già fatto nell'esempio di codice.