जवाबों:
यदि आप मेरी तरह हैं, तो कुछ लाइब्रेरी कोड का उपयोग करेंगे, जहां उन्होंने शायद सभी विशेष मामलों के बारे में सोचा होगा, जैसे कि क्या होता है यदि आप रास्ते में अशक्त या डॉट्स में गुजरते हैं, लेकिन फ़ाइल नाम में नहीं, तो आप निम्नलिखित का उपयोग कर सकते हैं:
import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
java.nio.file.Files
और Path
- जैसे को हल आधार निर्देशिका, एक पंक्ति नकल / चलती फ़ाइलें, केवल फ़ाइल नाम हो रही है के रूप में आदि
सबसे आसान तरीका एक नियमित अभिव्यक्ति का उपयोग करना है।
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
उपरोक्त अभिव्यक्ति एक या एक से अधिक वर्णों के बाद अंतिम बिंदु को हटा देगी। यहाँ एक बुनियादी इकाई परीक्षण है।
public void testRegex() {
assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
org.apache.commons
। जहां तक मेरी जानकारी है, यह एंड्रॉइड में ऐसा करने का एकमात्र तरीका है।
निम्नलिखित परीक्षण कार्यक्रम देखें:
public class javatemp {
static String stripExtension (String str) {
// Handle null case specially.
if (str == null) return null;
// Get position of last '.'.
int pos = str.lastIndexOf(".");
// If there wasn't any '.' just return the string as is.
if (pos == -1) return str;
// Otherwise return the string, up to the dot.
return str.substring(0, pos);
}
public static void main(String[] args) {
System.out.println ("test.xml -> " + stripExtension ("test.xml"));
System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml"));
System.out.println ("test -> " + stripExtension ("test"));
System.out.println ("test. -> " + stripExtension ("test."));
}
}
कौन से आउटपुट:
test.xml -> test
test.2.xml -> test.2
test -> test
test. -> test
foo.tar.gz
? मैं देख सकता हूं कि .tar.gz
आप क्या चाहते हैं।
foo.tar.gz
एक gzipped संस्करण है foo.tar
इसलिए आप यह भी तर्क दे सकते हैं कि gz
यह विस्तार था। यह सब नीचे आता है कि आप एक्सटेंशन को कैसे परिभाषित करते हैं।
.gitignore
?
यहाँ मेरी वरीयता द्वारा समेकित सूची क्रम है।
अपाचे कॉमन्स का उपयोग करना
import org.apache.commons.io.FilenameUtils;
String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);
OR
String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
Google अमरूद का उपयोग करना (यदि आप पहले से ही इसका उपयोग कर रहे हैं)
import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);
या कोर जावा का उपयोग कर
1)
String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
if (pos > 0 && pos < (fileName.length() - 1)) { // If '.' is not the first or last character.
fileName = fileName.substring(0, pos);
}
2)
if (fileName.indexOf(".") > 0) {
return fileName.substring(0, fileName.lastIndexOf("."));
} else {
return fileName;
}
3)
private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");
public static String getFileNameWithoutExtension(File file) {
return ext.matcher(file.getName()).replaceAll("");
}
लाइफ़रे एपीआई
import com.liferay.portal.kernel.util.FileUtil;
String fileName = FileUtil.stripExtension(file.getName());
यदि आपका प्रोजेक्ट अमरूद (14.0 या नया) का उपयोग करता है , तो आप साथ जा सकते हैं Files.getNameWithoutExtension()
।
(अनिवार्य रूप FilenameUtils.removeExtension()
से Apache Commons IO की तरह ही, जैसा कि सबसे अधिक वोट दिया गया उत्तर बताता है। बस अमरूद को इंगित करना चाहता था। व्यक्तिगत रूप से मैं कॉमन्स पर निर्भरता नहीं जोड़ना चाहता था - जो मुझे लगता है कि एक अवशेष है। सिर्फ इस वजह से।)
FilenameUtils.getBaseName()
नीचे का संदर्भ है https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java
/**
* Gets the base name, without extension, of given file name.
* <p/>
* e.g. getBaseName("file.txt") will return "file"
*
* @param fileName
* @return the base name
*/
public static String getBaseName(String fileName) {
int index = fileName.lastIndexOf('.');
if (index == -1) {
return fileName;
} else {
return fileName.substring(0, index);
}
}
यदि आप पूर्ण apache.commons आयात करना पसंद नहीं करते हैं, तो मैंने वही कार्यक्षमता निकाली है:
public class StringUtils {
public static String getBaseName(String filename) {
return removeExtension(getName(filename));
}
public static int indexOfLastSeparator(String filename) {
if(filename == null) {
return -1;
} else {
int lastUnixPos = filename.lastIndexOf(47);
int lastWindowsPos = filename.lastIndexOf(92);
return Math.max(lastUnixPos, lastWindowsPos);
}
}
public static String getName(String filename) {
if(filename == null) {
return null;
} else {
int index = indexOfLastSeparator(filename);
return filename.substring(index + 1);
}
}
public static String removeExtension(String filename) {
if(filename == null) {
return null;
} else {
int index = indexOfExtension(filename);
return index == -1?filename:filename.substring(0, index);
}
}
public static int indexOfExtension(String filename) {
if(filename == null) {
return -1;
} else {
int extensionPos = filename.lastIndexOf(46);
int lastSeparator = indexOfLastSeparator(filename);
return lastSeparator > extensionPos?-1:extensionPos;
}
}
}
जबकि मैं पुस्तकालयों के पुन: उपयोग में एक बड़ा विश्वास रखता हूं, org.apache.commons.io JAR 174KB है, जो एक मोबाइल ऐप के लिए काफी बड़ा है।
यदि आप स्रोत कोड डाउनलोड करते हैं और उनके फाइलनम्यूटिल्स वर्ग पर एक नज़र डालते हैं, तो आप देख सकते हैं कि बहुत सारी अतिरिक्त उपयोगिताएँ हैं, और यह विंडोज और यूनिक्स पथों का सामना करता है, जो सभी को प्यारा लगता है।
हालाँकि, यदि आप यूनिक्स शैली के पथ ("/" विभाजक के साथ) के साथ उपयोग के लिए कुछ स्थिर उपयोगिता विधियाँ चाहते हैं, तो आपको उपयोगी कोड नीचे मिल सकता है।
removeExtension
विधि फ़ाइल नाम के साथ पथ के बाकी बरकरार रखता है। एक समान भी है getExtension
।
/**
* Remove the file extension from a filename, that may include a path.
*
* e.g. /path/to/myfile.jpg -> /path/to/myfile
*/
public static String removeExtension(String filename) {
if (filename == null) {
return null;
}
int index = indexOfExtension(filename);
if (index == -1) {
return filename;
} else {
return filename.substring(0, index);
}
}
/**
* Return the file extension from a filename, including the "."
*
* e.g. /path/to/myfile.jpg -> .jpg
*/
public static String getExtension(String filename) {
if (filename == null) {
return null;
}
int index = indexOfExtension(filename);
if (index == -1) {
return filename;
} else {
return filename.substring(index);
}
}
private static final char EXTENSION_SEPARATOR = '.';
private static final char DIRECTORY_SEPARATOR = '/';
public static int indexOfExtension(String filename) {
if (filename == null) {
return -1;
}
// Check that no directory separator appears after the
// EXTENSION_SEPARATOR
int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);
if (lastDirSeparator > extensionPos) {
LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension");
return -1;
}
return extensionPos;
}
public static String getFileExtension(String fileName) {
if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
return fileName.substring(fileName.lastIndexOf(".") + 1);
}
public static String getBaseFileName(String fileName) {
if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
return fileName.substring(0,fileName.lastIndexOf("."));
}
रिश्तेदार पथ या पूर्ण पथ से नाम प्राप्त करने का सबसे सरल तरीका उपयोग कर रहा है
import org.apache.commons.io.FilenameUtils;
FilenameUtils.getBaseName(definitionFilePath)
आप इसे "" से विभाजित कर सकते हैं। और अनुक्रमणिका 0 पर फ़ाइल का नाम और 1 पर विस्तार है, लेकिन मैं Apache.commons-io से FileNameUtils के साथ सबसे अच्छे समाधान के लिए इच्छुक हूं, जैसा कि पहले लेख में उल्लेख किया गया था। इसे हटाया नहीं जाना चाहिए, लेकिन पर्याप्त है:
String fileName = FilenameUtils.getBaseName("test.xml");
Apache Commons IOFilenameUtils.removeExtension
से उपयोग करें
उदाहरण:
आप पूर्ण पथ नाम या केवल फ़ाइल नाम प्रदान कर सकते हैं ।
String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"
उम्मीद है की यह मदद करेगा ..
इसे सरल रखते हुए, जावा के String.replaceAll () विधि का उपयोग इस प्रकार करें:
String fileNameWithExt = "test.xml";
String fileNameWithoutExt
= fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );
यह तब भी काम करता है जब fileNameWithExt में पूरी तरह से योग्य पथ शामिल होता है।
आप एक्सटेंशन से फ़ाइल नाम को विभाजित करने के लिए जावा विभाजन फ़ंक्शन का उपयोग कर सकते हैं, यदि आप सुनिश्चित हैं कि फ़ाइल नाम में केवल एक डॉट है जो एक्सटेंशन के लिए है।
File filename = new File('test.txt');
File.getName().split("[.]");
इसलिए split[0]
"परीक्षण" वापस आएगा और विभाजन [1] वापस आएगा "txt"
नीचे दिए गए कोड का प्रयास करें। कोर जावा बुनियादी कार्यों का उपयोग करना। यह String
विस्तार के साथ, और बिना विस्तार ( '.'
चरित्र के बिना ) का ख्याल रखता है । कई '.'
का मामला भी कवर किया गया है।
String str = "filename.xml";
if (!str.contains("."))
System.out.println("File Name=" + str);
else {
str = str.substring(0, str.lastIndexOf("."));
// Because extension is always after the last '.'
System.out.println("File Name=" + str);
}
आप इसे null
स्ट्रिंग्स के साथ काम करने के लिए अनुकूलित कर सकते हैं।
.
फ़ाइल नाम में नहीं है, या फ़ाइल एक बैकअप है और इसका नाम पसंद है document.docx.backup
, आदि)। बाहरी पुस्तकालय का उपयोग करना अधिक विश्वसनीय है जो आपके लिए इस सभी असाधारण स्थितियों से निपटता है।