2009-11-08 9 views
19

मैंने जावा में फाइलों में हेरफेर करने वाले कई वर्ग विकसित किए हैं। मैं एक लिनक्स बॉक्स पर काम कर रहा हूं, और new File("path/to/some/file"); लिख रहा हूं। जब प्रतिबद्ध होने का समय आया तो मुझे एहसास हुआ कि परियोजना के कुछ अन्य डेवलपर्स विंडोज का उपयोग कर रहे हैं। अब मैं एक विधि को कॉल करना चाहूंगा जो फॉर्म "/path/to/some/file" के स्ट्रिंग में ले जा सकता है और ओएस के आधार पर, सही ढंग से अलग पथ लौटाता है।क्या जावा उपयोगिता है जो सही फ़ाइल विभाजक चार का उपयोग करने के लिए स्ट्रिंग पथ को परिवर्तित कर देगी?

उदाहरण के लिए:
"path/to/some/file" विंडोज पर "path\\to\\some\\file" बन जाता है।
लिनक्स पर यह केवल दिए गए स्ट्रिंग को देता है।

मुझे एहसास है कि यह नियमित अभिव्यक्ति को खारिज करने में लंबा समय नहीं लगेगा, लेकिन मैं पहिया को फिर से शुरू नहीं कर रहा हूं, और एक उचित परीक्षण समाधान पसंद करूंगा। यह अच्छा होगा अगर यह जेडीके में बनाया गया था, लेकिन अगर यह कुछ छोटी एफ/ओएसएस लाइब्रेरी का हिस्सा है जो ठीक है।

तो क्या जावा उपयोगिता है जो सही फ़ाइल विभाजक चार का उपयोग करने के लिए स्ट्रिंग पथ को परिवर्तित करेगा?

उत्तर

32

अपाचे कॉमन्स बचाव (फिर से) में आता है। कॉमन्स आईओ विधि FileNameUtilsseparatorsToSystem() आप जो चाहते हैं वह करेंगे।

कहने की जरूरत नहीं है, अपाचे कॉमन्स आईओ इसके अलावा बहुत कुछ करेगा और इसके लायक है।

+9

क्यों लोग एक लेखन से बचने के लिए फूला हुआ निर्भरता को जोड़ने का सुझाव दे रहते हो के लिए खोज नहीं होगा अलग है कोड की रेखा? – cletus

+13

मैं अपाचे कॉमन्स को ब्लोएटेड निर्भरता के रूप में नहीं मानता। यह इतना है कि मैं अपाचे कॉमन्स लैंग और आईओ को आजकल आवश्यक के रूप में मानता हूं। –

+7

प्लस, कोड की एकल पंक्तियों में आप कितनी बग पा सकते हैं? कितने धारणाएं और किनारे के मामलों को याद किया जाता है? –

16

एक "/path/to/some/file" वास्तव में Windows Vista और XP के तहत काम करता है।

new java.io.File("/path/to/some/file").getAbsoluteFile() 

> C:\path\to\some\file 

लेकिन यह अभी भी पोर्टेबल नहीं है के रूप में विंडोज कई roots है। तो रूट निर्देशिका को किसी भी तरह से चुना जाना है। सापेक्ष पथों में कोई समस्या नहीं होनी चाहिए।

संपादित करें:

अपाचे कॉमन्स कब यूनिक्स & खिड़कियों के अलावा अन्य envs साथ नहीं मदद करता है। Apache io source code:

public static String separatorsToSystem(String path) { 
    if (path == null) { 
    return null; 
    } 
    if (isSystemWindows()) { 
     return separatorsToWindows(path); 
    } else { 
     return separatorsToUnix(path); 
    } 
} 
+0

+1: बिल्कुल। मैं इस जवाब को तब तक पोस्ट करने वाला था जब तक मैंने देखा कि कोई पहले से ही नहीं हुआ है। – BalusC

+0

ओह, मुझे जोड़ना चाहिए: रूट डिस्क जो उपयोग की जा रही है वह वही रूट डिस्क है जहां वर्तमान कार्यशील निर्देशिका है (जहां से आपने जावा कोड को प्रश्न में निष्पादित किया है)। – BalusC

+1

क्या यह जावा के समर्थन के हर प्लेटफॉर्म पर काम करेगा? – Grundlefleck

2

आप

System.getProperty("file.separator") 

का उपयोग कर स्ट्रिंग उस पथ का प्रतिनिधित्व करता है का निर्माण करने का विकल्प होता है क्या?

+0

हां, लेकिन मैं स्ट्रिंग बनाना नहीं चाहता था। यह अनुमान लगाते हुए कि यह एक बहुत ही आम बात होनी चाहिए, मैं उस कोड के मौजूदा स्निपेट का पुन: उपयोग करना चाहता था जिसने चाल बनाई थी। – Grundlefleck

+1

यदि आपने हर जगह आगे स्लैश का उपयोग किया है तो आपके पास पथ है, ऐसा लगता है कि यह काम करता है। 'स्ट्रिंग फ़ाइलसेप = System.getProperty ("file.separator"); \t स्ट्रिंग पथ = "पथ/से/कुछ/फ़ाइल"; \t path.replaceAll ("/", fileSep); ' – Adam

+0

हाँ, थॉमस जंग ने अपने जवाब में उल्लेख किया। मेरे लिए खबर थी :) – Grundlefleck

0

यह हो नहीं कहना चाहिए पर्याप्त करने के लिए:

"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file" 
+1

जैसा कि मैंने अन्य टिप्पणियों में उल्लेख किया है, हां, मुझे पता था कि एक सरल स्ट्रिंग रणनीति को बदल देगा, लेकिन स्ट्रिंग को हैक करने से कोड कम पठनीय हो जाता है, और बेवकूफ टाइपो त्रुटियों को शुरू करने के लिए बहुत अधिक संभावना होती है । परीक्षण किए गए समाधान का उपयोग करना, और पठनीय यहां लक्ष्यों में से एक था। – Grundlefleck

3
के साथ नया जावा 7 वे एक वर्ग यह आप वास्तव में आप क्या चाहते हैं करने की अनुमति देता पथ कहा जाता है को शामिल किया है ( http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html देखें)

यहाँ

String rootStorePath = Paths.get("c:/projects/mystuff/").toString(); 
+4

क्षमा करें: यह क्रॉस-प्लेटफ़ॉर्म काम नहीं करता है। पथ वर्तमान ओएस मानता है। आपका उदाहरण विंडोज पथ की तरह दिखता है, लेकिन इसमें पहले से ही लिनक्स एन्कोडिंग है (जो शायद यह क्यों काम करता है)। यदि हम एक लिनक्स बॉक्स पर विंडोज पथ का प्रयास करते हैं तो यह निर्देशिकाओं की व्याख्या नहीं करेगा। जैसे Paths.get ("सी: \\ परियोजनाओं \\ mystuff")। GetParent() शून्य वापस देता है –

3

यह वही है अपाचे कॉमन्स-कब करता है, कोड की लाइनों के एक जोड़े में unrolled है:

एक उदाहरण है 210
String separatorsToSystem(String path) { 
    if (res==null) return null; 
    if (File.separatorChar=='\\') { 
     // From Windows to Linux/Mac 
     return res.replace('/', File.separatorChar); 
    } else { 
     // From Linux/Mac to Windows 
     return res.replace('\\', File.separatorChar); 
    } 
} 

तो यदि आप अतिरिक्त निर्भरता से बचना चाहते हैं, तो बस इसका उपयोग करें।

2

इस 7 साल बाद करने का प्रयास कर किसी को भी लिए, Apache Commons separatorsToSystem विधि FilenameUtils वर्ग के लिए ले जाया गया है:

FilenameUtils.separatorsToSystem(String path) 
0
String fileName = Paths.get(fileName).toString(); 

विंडोज के साथ काम करता है पूरी तरह से कम से कम भी मिश्रित रास्तों के साथ, उदाहरण के लिए

C: \ Users \ उपयोगकर्ता नाम/MyProject \ myfiles/MyFolder

हो जाता है

c:\users\username\myproject\myfiles\myfolder 

क्षमा जाँच नहीं की है क्या लिनक्स से ऊपर की हो जाएगा लेकिन वहाँ फिर से लिनक्स फ़ाइल संरचना ताकि आप इस तरह के एक निर्देशिका

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