2013-07-19 18 views
5

Tôi có tệp .jar có hai tệp .dll phụ thuộc vào. Tôi muốn biết nếu có bất kỳ cách nào cho tôi để sao chép các tập tin này từ bên trong .jar vào một thư mục tạm thời người dùng lúc chạy. đây là mã hiện tại mà tôi có (chỉ được chỉnh sửa cho một tải .dll để giảm kích thước câu hỏi):Cách sao chép các tệp ra khỏi jar hiện đang chạy

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

Vấn đề chính của tôi là lấy các tệp .dll ra khỏi bình khi chạy. Bất kỳ cách nào để lấy đường dẫn từ bên trong .jar sẽ hữu ích.

Xin cảm ơn trước.

+0

Bạn có muốn nhận đường dẫn của tệp arround .dll – user217895

+0

Có chỉ để tôi có thể truy cập tệp và sao chép chúng. Tất cả những gì tôi cần là đường dẫn lớp. Tôi đã biết cách sao chép các tập tin. – DeanMWake

Trả lời

8

Vì các tệp dll của bạn được nhóm trong tệp jar của bạn, bạn chỉ có thể thử nén chúng dưới dạng tài nguyên bằng cách sử dụng ClassLoader#getResourceAsStream và ghi chúng dưới dạng tệp nhị phân ở bất kỳ nơi nào bạn muốn trên ổ cứng.

Dưới đây là một số mẫu mã:

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

Đoạn mã trên sẽ trích xuất các dll nằm trong gói some.pack.age vào thư mục làm việc hiện tại.

+0

+1 cho mã ví dụ. Cảm ơn. Nó bây giờ hoạt động hoàn hảo với một chút tinh chỉnh. – DeanMWake

+0

@MethodMan Chào mừng bạn! – A4L

+0

Tôi nghĩ rằng bạn có nghĩa là: Bạn *;) – DeanMWake

0

Sử dụng myClass.getClassLoader().getResourceAsStream("loadAtRuntime.dll"); và bạn sẽ có thể tìm và sao chép các tệp DLL trong JAR. Bạn nên chọn một lớp học cũng sẽ có cùng một JAR.

0

Sử dụng trình tải lớp có thể định vị tài nguyên trong tệp JAR này. Hoặc bạn có thể sử dụng trình tải lớp của một lớp như Peter Lawrey đã đề xuất hoặc bạn cũng có thể tạo một URLClassLoader với URL tới JAR đó.

Khi bạn có trình nạp lớp đó, bạn có thể truy xuất luồng đầu vào byte bằng ClassLoader.getResourceAsStream. Mặt khác, bạn chỉ cần tạo một FileOutputStream cho tệp bạn muốn tạo.

Bước cuối cùng là sao chép tất cả byte từ luồng đầu vào sang luồng đầu ra, như bạn đã làm trong ví dụ mã của mình.

Các vấn đề liên quan