मैं जावा में एक स्ट्रिंग से फ़ाइल एक्सटेंशन कैसे ट्रिम करूं?


177

जावा में प्रत्यय ट्रिम करने का सबसे कुशल तरीका क्या है:

title part1.txt
title part2.html
=>
title part1
title part2

2
कुशल कोड वार, क्या आपका मतलब है कि मैं आशा करता हूं, सीपीयू बुद्धिमान नहीं
mkoryak

3
वह नहीं पूछ रहा था कि यह कैसे करना है, वह पूछ रहा था कि सबसे कुशल तरीका क्या है। मेरा उसी चीज़ को ढूंढते हुए यहाँ तक आना हुआ।
एडवर्ड फॉक

जवाबों:


285

यह एक ऐसा कोड है जिसे हमें स्वयं नहीं करना चाहिए। सांसारिक सामान के लिए पुस्तकालयों का उपयोग करें, कठिन सामान के लिए अपने मस्तिष्क को बचाएं।

इस मामले में, मैं Apache Commons IO से FilenameUtils.removeExtension () का उपयोग करने की सलाह देता हूं


7
बिल्कुल धमाकेदार।
जोशुआ पिंटर

6
95% परियोजनाओं के लिए, यह स्वीकृत उत्तर होना चाहिए। इस तरह से कोड को फिर से लिखना कई सिरदर्द का मूल कारण है!
कार्स्टन हॉफमैन

1
डिपेंडेन्सी जोड़ने के लिए ग्रेडेल में निम्नलिखित लाइन जोड़ें: - 'कॉमन्स-आईओ: कॉमन्स-आईओ: 2.6' का संकलन करें
दीपक शर्मा

उदाहरण कृपया।
जॉन ktejik

8
यदि आपके पास अपाचे कॉमन्स I / O पहले से ही आपके प्रोजेक्ट में है, तो यह सही है। लेकिन अगर यह सब आपको इसकी ज़रूरत है, तो आप अपने प्रोजेक्ट के लिए कम से कम 2.5 एमबी डेड वेट जोड़ रहे हैं, जो एक लाइन के साथ आसानी से किया जा सकता है।
फू

227
str.substring(0, str.lastIndexOf('.'))

8
इसे एक नए चर को सौंपा जाना चाहिए क्योंकि str संशोधित नहीं है।
नाथन फ़ेगर

51
संभाल के साथ संभाल: यह आप पर एक अपवाद फेंक देंगे अगर फ़ाइल का नाम कोई प्रत्यय नहीं है।
एंड्रियास डॉक

24
क्या पुरालेख के बारे में ।.tar.bz2?
एंटोनियो

20
if(str.contains(".")) str.substring(0, str.lastIndexOf('.'))
निकोलस टायलर

6
if (str! = null && str.contains ("।")) str.substring (0, str.lastIndexOf ('।'))। FilenameUtils एक और निर्भरता है, और हमेशा उपलब्ध नहीं है
ocramot

88

का उपयोग कर के रूप में String.substringऔर String.lastIndexएक एक लाइनर अच्छा है में, वहाँ कुछ फ़ाइल पथ के साथ सामना करने में सक्षम होने के मामले में कुछ मुद्दे हैं।

उदाहरण के लिए निम्न पथ लें:

a.b/c

वन-लाइनर का उपयोग करने के परिणामस्वरूप होगा:

a

यह गलत है।

परिणाम होना चाहिए था c, लेकिन चूंकि फ़ाइल में एक्सटेंशन का अभाव था, लेकिन पथ में निर्देशिका के साथ .नाम था, एक-लाइनर विधि को फ़ाइल नाम के रूप में पथ का हिस्सा देने के लिए ट्रिक किया गया था, जो सही नहीं है।

जाँच की आवश्यकता है

Skaffman के जवाब से प्रेरित होकर , मैंने Apache Commons IO की FilenameUtils.removeExtensionविधि पर एक नज़र डाली

इसके व्यवहार को फिर से बनाने के लिए, मैंने कुछ परीक्षण लिखे जिन्हें नई विधि को पूरा करना चाहिए, जो निम्नलिखित हैं:

पथ का नाम
-------------- --------
a / b / सीसी
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg

ab / सीसी
ab / c.jpg c
ab / c.jpg.jpg c.jpg

सीसी
c.jpg सी
c.jpg.jpg c.jpg

(और यह कि मैंने सभी के लिए जाँच की है - शायद अन्य चेक हैं जो उस जगह पर होना चाहिए जिसे मैंने अनदेखा किया है।)

कार्यान्वयन

removeExtensionविधि के लिए मेरा कार्यान्वयन निम्नलिखित है :

public static String removeExtension(String s) {

    String separator = System.getProperty("file.separator");
    String filename;

    // Remove the path upto the filename.
    int lastSeparatorIndex = s.lastIndexOf(separator);
    if (lastSeparatorIndex == -1) {
        filename = s;
    } else {
        filename = s.substring(lastSeparatorIndex + 1);
    }

    // Remove the extension.
    int extensionIndex = filename.lastIndexOf(".");
    if (extensionIndex == -1)
        return filename;

    return filename.substring(0, extensionIndex);
}

removeExtensionउपरोक्त परीक्षणों के साथ इस विधि को चलाने से ऊपर सूचीबद्ध परिणाम मिलते हैं।

विधि का परीक्षण निम्न कोड के साथ किया गया था। जैसा कि यह विंडोज़ पर चलाया गया था, पथ विभाजक वह है \जिसे \एक Stringशाब्दिक भाग के रूप में उपयोग किए जाने पर बच जाना चाहिए ।

System.out.println(removeExtension("a\\b\\c"));
System.out.println(removeExtension("a\\b\\c.jpg"));
System.out.println(removeExtension("a\\b\\c.jpg.jpg"));

System.out.println(removeExtension("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\c.jpg.jpg"));

System.out.println(removeExtension("c"));
System.out.println(removeExtension("c.jpg"));
System.out.println(removeExtension("c.jpg.jpg"));

परिणाम थे:

c
c
c.jpg
c
c
c.jpg
c
c
c.jpg

परिणाम वांछित परिणाम हैं जो परीक्षण में उल्लिखित विधि को पूरा करना चाहिए।


4
बहुत बढ़िया जवाब। क्या कोई विशेष कारण है जो आप उपयोग करते हैं System.getProperty("file.separator")और न कि बस File.separator?
हलिरुटन

2
चेतावनी का एक शब्द: यह समाधान अपाचे कॉमन्स IO विधि के विपरीत, पूर्ववर्ती मार्ग को ही नहीं, विस्तार को भी हटा देता है।
डीएचए

3
ऐसा प्रतीत होता है कि यह/path/to/.htaccess
कुजेको

17

BTW, मेरे मामले में, जब मैं एक विशिष्ट विस्तार को हटाने के लिए एक त्वरित समाधान चाहता था, यह लगभग यही है जो मैंने किया था:

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;

16
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));

4
नहीं, एक से अधिक भी हो सकते हैं '।' आप lastIndexOf ('।') चाहते हैं
एडम Jaskiewicz

-1 मैं आप का उपयोग कर रहे थे कि विधि का उपयोग नहीं करने के लिए। वह अब मुझसे कुल +0 है। इसे जल्दी बदलो! ;)
माइकल मायर्स

7
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
  fileName=fileName.substring(0,dotIndex);
}

क्या यह एक चाल सवाल है? : p

मैं एक तेजी से रास्ता एटीएम के बारे में नहीं सोच सकता।


7

com.google.common.io.Filesयदि आपकी परियोजना पहले से Google कोर लाइब्रेरी पर निर्भर है, तो कक्षा में एक विधि का उपयोग करें । जिस विधि की आपको आवश्यकता है getNameWithoutExtension


कोई मेरे जवाब के खिलाफ क्यों है ??
टॉबी

ध्यान दें कि यह केवल आधार नाम लौटाता है, इसलिए रास्ता भी निकाला जाता है: google.github.io/guava/releases/19.0/api/docs/com/google/common/…
thSoft

6

आप इस फ़ंक्शन को आज़मा सकते हैं, बहुत ही बुनियादी

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}

5

मुझे कूलबर्ड का उत्तर विशेष रूप से उपयोगी लगा।

लेकिन मैंने अंतिम परिणाम बयानों को बदल दिया:

if (extensionIndex == -1)
  return s;

return s.substring(0, lastSeparatorIndex+1) 
         + filename.substring(0, extensionIndex);

जैसा कि मैं चाहता था कि पूर्ण पथ का नाम वापस हो।

तो "C: \ Users \ mroh004.COM \ Documents \ Test \ Test.xml" बन जाता है 
   "C: \ Users \ mroh004.COM \ Documents \ Test \ Test" और नहीं
   "परीक्षा"

5
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();

3
जो पूछा गया था उसके विपरीत और लंबाई पास करने की कोई आवश्यकता नहीं है, बस एक arg सबस्ट्रिंग का उपयोग करें

4

एक regex का उपयोग करें। यह एक अंतिम बिंदु और उसके बाद सब कुछ बदल देता है।

String baseName = fileName.replaceAll("\\.[^.]*$", "");

आप एक पैटर्न ऑब्जेक्ट भी बना सकते हैं, यदि आप regex को प्री-कंपाइल करना चाहते हैं।


1
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");

के "\\."रूप में विभाजित करने की आवश्यकता है "।" रेगेक्स के लिए विशेष है।
कंपास

1

स्ट्रिंग छवि पथ के साथ एक नई फ़ाइल बनाएँ

String imagePath;
File test = new File(imagePath);
test.getName();
test.getPath();
getExtension(test.getName());


public static String getExtension(String uri) {
        if (uri == null) {
            return null;
        }

        int dot = uri.lastIndexOf(".");
        if (dot >= 0) {
            return uri.substring(dot);
        } else {
            // No extension.
            return "";
        }
    }

1

org.apache.commons.io.FilenameUtils संस्करण 2.4 निम्नलिखित उत्तर देता है

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);
    }
}

public static int indexOfExtension(String filename) {
    if (filename == null) {
        return -1;
    }
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
    int lastSeparator = indexOfLastSeparator(filename);
    return lastSeparator > extensionPos ? -1 : extensionPos;
}

public static int indexOfLastSeparator(String filename) {
    if (filename == null) {
        return -1;
    }
    int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
    int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
    return Math.max(lastUnixPos, lastWindowsPos);
}

public static final char EXTENSION_SEPARATOR = '.';
private static final char UNIX_SEPARATOR = '/';
private static final char WINDOWS_SEPARATOR = '\\';

1
 private String trimFileExtension(String fileName)
  {
     String[] splits = fileName.split( "\\." );
     return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
  }

0

मैं यह करना चाहूंगा:

String title_part = "title part1.txt";
int i;
for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--);
title_part = title_part.substring(0,i);

अंत तक '।' इसके बाद सबस्ट्रिंग को कॉल करें।

संपादित करें: एक गोल्फ नहीं हो सकता है लेकिन यह प्रभावी है :)


7
कि मूल रूप से lastIndexOf वैसे भी क्या करता है; पहिया को क्यों मजबूत करें?
माइकल मायर्स

मज़े के लिए और थोड़ा वर्णनात्मक होने के लिए। बस कि। (और मैं
lastIndexOf के

0

उन परिदृश्यों को ध्यान में रखते हुए जहाँ कोई फ़ाइल एक्सटेंशन नहीं है या एक से अधिक फ़ाइल एक्सटेंशन नहीं है

उदाहरण फ़ाइल नाम: फ़ाइल | file.txt | file.tar.bz2

/**
 *
 * @param fileName
 * @return file extension
 * example file.fastq.gz => fastq.gz
 */
private String extractFileExtension(String fileName) {
    String type = "undefined";
    if (FilenameUtils.indexOfExtension(fileName) != -1) {
        String fileBaseName = FilenameUtils.getBaseName(fileName);
        int indexOfExtension = -1;
        while (fileBaseName.contains(".")) {
            indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
            fileBaseName = FilenameUtils.getBaseName(fileBaseName);
        }
        type = fileName.substring(indexOfExtension + 1, fileName.length());
    }
    return type;
}

0
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;

try {
    uri = new URI(img);
    String[] segments = uri.getPath().split("/");
    System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
    e.printStackTrace();
}

यह दोनों img और imgLink के लिए उदाहरण का आउटपुट देगा


0
public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}

यह "(a .jpg.jpg") को "(सही)" a.jpg "के बजाय" ए "में बदल देगा। file.length() > 0चेक किस उद्देश्य से कार्य करता है ?
क्लॉस गुटर

मुख्य प्रश्न था "एक्सटेंशन कैसे हटाएं?", इसलिए हां इसका रूपांतरण "a.txt.zip" को "ए" और ".htaccess" को खालीपन में बदल देता है। यह फ़ंक्शन स्ट्रिंग्स के साथ काम करता है, इसलिए फ़ाइल नाम शून्य नहीं हो सकते हैं, लेकिन फिर भी 0 लंबाई हो सकती है, अगर यह पार्स प्रतीकों से पहले इसके लायक है तो तेजी से जांचें। सादर।
एलेक्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.