2013-07-19 14 views
5

से फ़ाइलों की प्रतिलिपि कैसे करें मेरे पास एक .jar है जिसमें दो .dll फ़ाइलें हैं जो यह निर्भर है। मैं जानना चाहूंगा कि मेरे लिए इन फ़ाइलों को .jar में से किसी उपयोगकर्ता टेम्पल फ़ोल्डर में रनटाइम पर कॉपी करने का कोई तरीका है या नहीं।वर्तमान में चल रहे जार

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

मेरा मुख्य समस्या रनटाइम पर जार से बाहर .dll फ़ाइलें हो रही है: यहाँ वर्तमान कोड है कि मैं (सिर्फ एक .dll लोड करने के लिए संपादित प्रश्न के आकार को कम करने के लिए) है। .jar के भीतर से पथ को पुनर्प्राप्त करने का कोई भी तरीका सहायक होगा।

अग्रिम धन्यवाद।

+0

क्या आप आसपास के डीडी फाइलों के पथ प्राप्त करना चाहते हैं – user217895

+0

हां बस मैं फाइलों पर जा सकता हूं और उन्हें कॉपी कर सकता हूं। मुझे बस वर्ग पथ की जरूरत है। मैं पहले से ही फाइलों की प्रतिलिपि बनाने के बारे में जानता हूं। उदाहरण कोड के लिए – DeanMWake

उत्तर

8

चूंकि आपके डीएलएस आपके जार फ़ाइल के अंदर बंडल किए गए हैं, इसलिए आप उन्हें ClassLoader#getResourceAsStream का उपयोग करके संसाधनों के रूप में एकत्रित करने का प्रयास कर सकते हैं और उन्हें हार्ड ड्राइव पर कहीं भी बाइनरी फाइलों के रूप में लिख सकते हैं।

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

कोड ऊपर वर्तमान कार्यशील निर्देशिका के लिए पैकेज some.pack.age में स्थित dll निकाल लेंगे:

यहां कुछ नमूना कोड है।

+0

+1। धन्यवाद। यह अब थोड़ा tweaking के साथ पूरी तरह से काम करता है। – DeanMWake

+0

@MethodMan आपका स्वागत है! – A4L

+0

मुझे लगता है कि आपका मतलब है: आप *; – DeanMWake

0

myClass.getClassLoader().getResourceAsStream("loadAtRuntime.dll"); का उपयोग करें और आप जेएआर में डीएलएल को ढूंढ और कॉपी करने में सक्षम होंगे। आपको एक कक्षा चुननी चाहिए जो एक ही जार में भी होगी।

0

इस जेएआर फ़ाइल में संसाधनों का पता लगाने में सक्षम क्लास लोडर का उपयोग करें। या तो आप पीटर लॉरी के सुझाव के रूप में कक्षा के वर्ग लोडर का उपयोग कर सकते हैं, या आप उस JAR के यूआरएल के साथ URLClassLoader भी बना सकते हैं।

एक बार आपके पास उस क्लास लोडर होने के बाद आप ClassLoader.getResourceAsStream के साथ एक बाइट इनपुट स्ट्रीम पुनर्प्राप्त कर सकते हैं। दूसरी ओर आप जिस फ़ाइल को बनाना चाहते हैं उसके लिए आप केवल FileOutputStream बनाएं।

अंतिम चरण इनपुट स्ट्रीम से सभी बाइट्स को आउटपुट स्ट्रीम में कॉपी करना है, जैसा कि आपने पहले से ही अपने कोड उदाहरण में किया है।

संबंधित मुद्दे