2011-12-06 9 views
17

मैं अपने एक्सटेंशन के बिना File ऑब्जेक्ट का नाम प्राप्त करने का प्रयास कर रहा हूं, उदा। फ़ाइल नाम "vegetation.txt" होने पर "वनस्पति" प्राप्त करना मैं इस कोड को लागू करने की कोशिश की है:जावा ऑब्जेक्ट के बिना जावा ऑब्जेक्ट का नाम कैसे प्राप्त करें?

openFile = fileChooser.getSelectedFile(); 
String[] tokens = openFile.getName().split("."); 
String name = tokens[0]; 

दुर्भाग्य से, यह एक null वस्तु देता है। String ऑब्जेक्ट को परिभाषित करने में केवल एक समस्या है, मुझे लगता है, क्योंकि विधि getName() सही तरीके से काम करती है; यह मुझे अपने विस्तार के साथ फ़ाइल का नाम देता है।

क्या आपके पास कोई विचार है?

उत्तर

36

आप स्वयं वह लागू करना चाहते हैं, इस प्रयास करें:

String name = file.getName(); 
int pos = name.lastIndexOf("."); 
if (pos > 0) { 
    name = name.substring(0, pos); 
} 

(यह परिवर्तन नहीं करता है ' टी ".txt" जैसा एक इनपुट फ़ाइल नाम के लिए कोई रिक्त स्ट्रिंग के साथ छोड़। आप स्ट्रिंग चाहते हैं कि मामले में खाली होने के लिए, >= 0 को > 0 बदल जाते हैं।)


आप 01 की जगह सकता हैएक सशर्त अभिव्यक्ति का उपयोग करके असाइनमेंट के साथ कथन, यदि आपने सोचा कि यह आपके कोड को और अधिक पठनीय बनाता है; उदाहरण के लिए @ स्टीवन का जवाब देखें। (मुझे नहीं लगता कि यह करता है ... लेकिन यह राय की बात है।)


यह यकीनन एक कार्यान्वयन कि किसी और लिखा गया है और परीक्षण किया गया है का उपयोग करने के लिए एक बेहतर विचार है। अपाचे FilenameUtils एक अच्छा विकल्प है; @ स्लेचनिक का उत्तर देखें, और लिंक किए गए क्यू & ए

+0

मेरी समस्या को हल करने के लिए बहुत बहुत धन्यवाद :) – MichalB

4

मैं "।" की अंतिम अनुक्रमणिका से पहले काटना पसंद करता हूं। फ़ाइल नाम होने के लिए। इस तरह एक फ़ाइल नाम: hello.test.txt सिर्फ hello.test

है अर्थात

int pos = filename.lastIndexOf("."); 
String justName = pos > 0 ? filename.substring(0, pos) : filename; 

आप भी कोई विस्तार किया जा रहा है संभाल करने की जरूरत है।

2

आप split("\\."); आज़मा सकते हैं। वह मूल रूप से . से बच रहा है क्योंकि इसे रेगेक्स में सभी वर्णों के रूप में माना जाता है।

2

स्ट्रिंग # विभाजन एक रेगेक्स लेता है। "।" किसी भी चरित्र से मेल खाता है, इसलिए आपको खाली तारों की एक सरणी मिल रही है - प्रत्येक अक्षर के लिए प्रत्येक स्थान के लिए एक।

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

2

वहाँ अपने कोड के साथ दो समस्याएं हैं ...

1) बस का उपयोग कर "।" क्योंकि विभाजित करने के लिए तर्क को रेजेक्स के रूप में व्याख्या किया जा रहा है जिसे आप नहीं चाहते हैं। आप एक शाब्दिक बिंदु चाहते हैं। तो आपको इसे बचाना होगा ...

openFile.getName().split("\\."); 

2) आप गलत तरीके से एक से अधिक डॉट के साथ किसी फ़ाइल को पार्स करेंगे। यह करने के लिए सबसे अच्छा तरीका है पिछले डॉट के लिए खोज और सबस्ट्रिंग पाने के लिए ...

int pos = openFile.getName().lastIndexOf("."); 
if(pos != -1) { 
    String name = openFile.getName().substring(0, pos); 
} 
17

यदि आप स्वयं यह कोड नहीं लिखना चाहते हैं तो आप अपाचे के FilenameUtils का उपयोग कर सकते हैं।

FilenameUtils.getBaseName(openFile.getName()); 

यह फ़ाइल नाम को पथ और विस्तार से घटा देगा।

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