जावा 7 पथ के विस्तार की जांच कैसे करें


84

अगर एक पथ (जावा 7 में पेश) एक निश्चित विस्तार के साथ समाप्त होता है, तो मैं जांचना चाहता हूं । मैं इस endsWith()तरह की विधि की कोशिश की :

Path path = Paths.get("foo/bar.java")
if (path.endsWith(".java")){
    //Do stuff
}

हालाँकि, यह काम नहीं करता है क्योंकि यह path.endsWith(".java")गलत है। ऐसा लगता है कि endsWith()विधि केवल तभी सही हो जाती है जब अंतिम निर्देशिका विभाजक (जैसे bar.java) के बाद सब कुछ के लिए एक पूर्ण मैच होता है, जो मेरे लिए व्यावहारिक नहीं है।

तो मैं एक पथ के फ़ाइल एक्सटेंशन की जांच कैसे कर सकता हूं?



1
@assylias, यह सवाल ए से एक्सटेंशन खोजने के लिए है String, न कि एक Path(हालांकि यह साथ काम करेगा Path.toString(), लेकिन मैं एक ऐसे तरीके की उम्मीद कर रहा था जिसकी आवश्यकता नहीं होगी)।
थंडरफोर्ज

फ़ाइल एक्सटेंशन की धारणा ओएस पर निर्भर है इसलिए मुझे नहीं लगता कि फ़ाइल या पथ में इसके लिए समर्थन है।
अस्वच्छता

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

जवाबों:


84

Java NIO का PathMatcher FileSystem.getPathMatcher (स्ट्रिंग सिंटैक्सएंडपैटर्न) प्रदान करता है :

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

Path filename = ...;
if (matcher.matches(filename)) {
    System.out.println(filename);
}

देखें ढूँढना फ़ाइलें जानकारी के लिए ट्यूटोरियल।


14
मुझे लगता है कि यह एक तारांकन गायब है, मेरे लिए निम्नलिखित काम करता है:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
जोश

22
और यदि आप अलग-अलग निर्देशिकाओं के माध्यम से देख रहे हैं, तो आपको "ग्लोब: **। जावा" का उपयोग करने की आवश्यकता है
LaGrandMere

1
मेरे लिए LaGrandMere की टिप्पणी ने चाल चली। यदि @Dave जार्विस अपनी सलाह को चुने हुए उत्तर में मिला सकता है, तो मुझे लगता है कि इससे NIO-API में शुरुआती लोगों को मदद मिलेगी। विन्डोज़ के तहत: यदि मैं उपयोग करना चाहता हूं glob:*.java, तो filenameकोई भी पैरेंट-पाथ नहीं होना चाहिए। अगर मैं किसी rel / abs पथ का उपयोग करता हूं glob:c:/users/muchwow/*.java, तो यह काम करता है (ध्यान दें कि \\\\ का बैकस्लैश के साथ उपयोग किया जाना है)। पैटर्न glob:**.javaसिर्फ * .java के साथ सब कुछ खोजता है, चाहे वह मूल मार्ग का हो।
JackLeEmmerdeur

67

Pathशायद इसलिए है क्योंकि फाइल सिस्टम में ही यह नहीं है वर्ग, "एक्सटेंशन" की एक धारणा नहीं है। यही कारण है कि आपको इसके Stringप्रतिनिधित्व की जांच करने और यह देखने की आवश्यकता है कि क्या यह चार पांच चरित्र स्ट्रिंग के साथ समाप्त होता है .java। ध्यान दें कि endsWithयदि आप मिश्रित मामले को कवर करना चाहते हैं, तो आपको सरल से भिन्न तुलना की आवश्यकता है , जैसे ".JAVA"और ".Java":

path.toString().toLowerCase().endsWith(".java");

संभव NullPointer के कारण यह अच्छा समाधान नहीं है। जैसा कि ऊपर उल्लेख किया गया है, कुछ पुस्तकालय (जैसे एपाचे आईओ बर्तन) या पथमेकर का उपयोग करना बेहतर है।
काहनूसोवा

15

सरल समाधान:

if( path.toString().endsWith(".java") ) //Do something

Path.endsWith पद्धति का उपयोग करते समय आपको लापरवाह होना चाहिए। जैसा कि आपने कहा था, यह विधि तभी सही होगी जब यह आपके पाथ ऑब्जेक्ट के सबलेमेंट से मेल खाएगा। उदाहरण के लिए:

Path p = Paths.get("C:/Users/Public/Mycode/HelloWorld.java");
System.out.println(p.endsWith(".java")); // false
System.out.println(p.endsWith("HelloWorld.java")); // true

3

सीधे पथ ऑब्जेक्ट पर ऐसा करने का कोई तरीका नहीं है।

मेरे देखे दो विकल्प हैं:

  1. पथ को फ़ाइल में बदलें और सिरों को कॉल करें। File.getName द्वारा लौटाए गए स्ट्रिंग पर ()
  2. पथ पर कॉलिंग स्ट्रिंग और उस स्ट्रिंग पर कॉल समाप्त होता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.