wake-up-neo.com

Wie bekomme ich den Dateinamen ohne die Erweiterung in Java?

Kann mir jemand sagen, wie man den Dateinamen ohne die Erweiterung erhält? Beispiel:

fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
211
Iso

Wenn Sie wie ich lieber Bibliothekscode verwenden möchten, bei dem sie wahrscheinlich an alle Sonderfälle gedacht haben, z. B. was passiert, wenn Sie null oder Punkte im Pfad, aber nicht im Dateinamen übergeben, können Sie das verwenden folgende:

import org.Apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
366
Ulf Lindback

Der einfachste Weg ist die Verwendung eines regulären Ausdrucks.

fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");

Der obige Ausdruck entfernt den letzten Punkt gefolgt von einem oder mehreren Zeichen. Hier ist ein grundlegender Komponententest.

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
137
brianegge

Siehe folgendes Testprogramm:

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

welche Ausgänge:

test.xml   -> test
test.2.xml -> test.2
test       -> test
test.      -> test
50
paxdiablo

Wenn Ihr Projekt Guava (14.0 oder neuer) verwendet, können Sie mit Files.getNameWithoutExtension() fortfahren.

(Im Wesentlichen dasselbe wie FilenameUtils.removeExtension() von Apache Commons IO, wie die höchst gewählte Antwort vorschlägt. Ich wollte nur auf Guava hinweisen und tut das auch. Persönlich wollte ich Commons nicht die Abhängigkeit hinzufügen - was ich für eine bin ein bisschen ein Relikt - nur deshalb.)

38
Jonik

Hier ist die konsolidierte Listenreihenfolge nach meinen Wünschen.

Apache Commons verwenden

import org.Apache.commons.io.FilenameUtils;

String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);

                           OR

String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);

Verwenden von Google Guava (wenn Sie es bereits verwenden)

import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);

Oder mit Core Java

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

Liferay API

import com.liferay.portal.kernel.util.FileUtil; 
String fileName = FileUtil.stripExtension(file.getName());
31
Om.

Wenn Sie nicht die vollständigen Apache.commons importieren möchten, habe ich die gleiche Funktionalität extrahiert:

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;
        }
    }
}
5
Hamzeh Soboh

Während ich fest davon überzeugt bin, Bibliotheken wiederzuverwenden, ist der JAR org.Apache.commons.io 174 KB, was für eine mobile App merklich groß ist. 

Wenn Sie den Quellcode herunterladen und einen Blick auf die FilenameUtils-Klasse werfen, können Sie feststellen, dass es viele zusätzliche Hilfsprogramme gibt, die mit Windows- und Unix-Pfaden zurechtkommen, was alles sehr schön ist.

Wenn Sie jedoch nur ein paar statische Hilfsprogrammmethoden zur Verwendung mit Unix-Stilpfaden (mit einem "/" - Trennzeichen) wünschen, kann der folgende Code nützlich sein. 

Die removeExtension-Methode behält den Rest des Pfads zusammen mit dem Dateinamen bei. Es gibt auch eine ähnliche 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;
}
4
Dan J

Unten finden Sie eine Referenz von 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);
    }
}
4
David Cheung
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("."));
    }
0
Gil SH

Sie können es durch "." und auf Index 0 ist Dateiname und auf 1 ist Erweiterung, aber ich würde für die beste Lösung mit FileNameUtils von Apache.commons-io neigen, wie es im ersten Artikel erwähnt wurde. Es muss nicht entfernt werden, ist aber ausreichend:

String fileName = FilenameUtils.getBaseName("test.xml");

0
Peter S.