2010-03-19 12 views
5

में विंडोज फ़ाइल पथ से निपटने के लिए हैक की तलाश में कहें कि आपके पास विंडोज़ एप्लिकेशन के शीर्ष पर जावा के शीर्ष पर एक बड़ी विरासत कोल्डफ्यूजन है। फ़ाइल एक्सेस java.io.File और CFFILE के माध्यम से किया जाता है (जो बदले में java.io.File का उपयोग करता है), लेकिन किसी भी फ़ाइल एक्सेस लाइब्रेरी में किसी भी तरह से केंद्रीकृत नहीं किया जाता है। इसके अलावा, कहें कि आपके पास कोड में हार्ड कोड कोड और डेटाबेस में दोनों फ़ाइल पथ हैं।जावा: लिनक्स

दूसरे शब्दों में, मान लें कि फ़ाइल पथ स्वयं नहीं बदल सकते हैं।

  • c:: वे या तो स्थानीय या दूरदराज के विंडोज फ़ाइल पथ हो सकता है \ अस्थायी \ file.txt
  • \\ सर्वर \ शेयर \ file.txt

इस चलाने के लिए एक रास्ता है न्यूनतम कोड परिवर्तन के साथ लिनक्स पर आवेदन? मैं रचनात्मक समाधान की तलाश में हूं कि विरासत कोड को छूने में शामिल न हों।

कुछ विचार:

  • भागो यह शराब पर। यह वास्तव में काम करता है, क्योंकि वाइन स्थानीय पथ का अनुवाद करेगा, और दूरस्थ पथ के लिए एक सांबा क्लाइंट है।
  • क्या कस्टम कोड के साथ फ़ाइल पथ अनुवाद करने के लिए java.io.File को ओवरराइड करने का कोई तरीका है? इस मामले में, मैं दूरस्थ पथ को माउंट पॉइंट पर अनुवादित करूंगा।

उत्तर

6

क्या कस्टम कोड के साथ फ़ाइल पथ अनुवाद करने के लिए java.io.File को ओवरराइड करने का कोई तरीका है? इस मामले में, मैं एक माउंट बिंदु

हाँ करने के लिए दूरदराज के रास्तों अनुवाद होगा, आप java.io.File का अपना स्वयं का कार्यान्वयन करते हैं और एक अलग जार में रखें और फिर असली java.io.File के बजाय इसे लोड कर सकते हैं।

यह आप जावा लांचर में java.endorsed.dirs संपत्ति या java -Xbootclasspath/p:path विकल्प (जावा)

लेकिन उपयोग कर सकते हैं या तो JVM लोड करने के लिए !!!

java.io.File कक्षा का अपना संस्करण बनाना विरासत स्रोत कोड को संशोधित करने जितना आसान नहीं होगा।

आप कुछ आप पहली बार अपने सभी हार्डकोडेड रास्तों एक संसाधन बंडल का उपयोग करने के लिए निकाल सकते तोड़ने का डर रहे हैं:

तो:

File file = new File("C:\\Users\\oreyes\\etc.txt"); 

होगा:

File file = new File(Paths.get("user.dir.etc")); 

और Paths एक संसाधन बंडल आंतरिक

class Paths { 
    private static ResourceBundle rs = ResourceBundle.getBundle("file.paths"); 
    public static String get(String key) { 
     rs.getString(key); 
    } 
} 
होता है

आप एक IDE (आमतौर पर एक अंतर्राष्ट्रीयकरण प्लगइन)

लिनक्स और अपने काम करने के लिए एक अलग संसाधन बंडल प्रदान के साथ सभी इस हार्डकोडेड रास्तों निकासी कर सकते हैं। टेस्ट और फिर से परीक्षण और पुन: परीक्षण

तो, अपने स्वयं के java.io.File केवल के रूप में एक अंतिम संसाधन उपलब्ध कराने का उपयोग करें।

+1

मैं JDK से नवीनतम संस्करण को डाउनलोड करने और यह शाखाओं द्वारा अपने ही java.io.File प्रोटोटाइप समाप्त हो गया। मैं एक एओपी समाधान पर काम कर रहा हूं जो अधिक रखरखाव योग्य होगा। –

+0

यह घंटों या मजेदार की तरह लगता है !! :) – OscarRyz

2

java.io.File अंतिम श्रेणी नहीं है, और इसे बढ़ाया जा सकता है। आपके एक्सटेंशन में आपके पास एक (या अधिक) रचनाकार हो सकते हैं जो फ़ाइल पथ का अनुवाद करेंगे। यह केवल आपको अनुवादक लिखने की आवश्यकता होगी, और विस्तारित कक्षा में फ़ाइल के हर प्रारंभिक परिवर्तन को बदल देगा।

चूंकि आपकी कक्षा java.io.File का विस्तार करेगी, फिर भी प्रारंभिककरण को बदलने के अलावा कोई अन्य कोड परिवर्तन आवश्यक नहीं है।

java.io.File file1 = new ClassThatExtendsFile("C:\temp\file.txt"); 

[संपादित करें]: या आप CFFILE का विस्तार कर सकते हैं, और इसके रचनाकारों को ओवरराइड कर सकते हैं।

+0

क्या मैं से बचने के लिए हर जगह एक CFFILE या java.io.File प्रयोग किया जाता है विरासत कोड को छू रहा चाहते हैं। अब, अगर मैं अपने स्वयं के कार्यान्वयन के साथ java.io.File को प्रतिस्थापित कर सकता हूं, तो यह होगा। –

+1

ऐसा करने के लिए, उसे स्रोत कोड को संशोधित करना होगा और उस स्थिति में यदि वह प्रक्रिया में पथ बदलता है तो बेहतर होगा। – OscarRyz

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