Gibt es einen besseren Weg, um den Basisnamen und die Dateierweiterung einer Datei zu erhalten als so etwas
File f = ...
String name = f.getName();
int dot = name.lastIndexOf('.');
String base = (dot == -1) ? name : name.substring(0, dot);
String extension = (dot == -1) ? "" : name.substring(dot+1);
FilenameUtils
. Es hat diegetBaseName(..)
undgetExtension(..)
Methoden.Antworten:
Ich weiß, dass andere erwähnt haben
String.split
, aber hier ist eine Variante, die nur zwei Token (die Basis und die Erweiterung) ergibt :String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
Zum Beispiel:
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
Ausbeuten:
["test.cool.awesome", "txt"]
Der reguläre Ausdruck weist Java an, sich auf einen Zeitraum aufzuteilen, auf den eine beliebige Anzahl von Nicht-Zeiträumen folgt, gefolgt vom Ende der Eingabe. Es gibt nur einen Zeitraum, der dieser Definition entspricht (nämlich den letzten Zeitraum).
TechnischRegexisch gesehen wird diese Technik als positiver Lookahead mit der Breite Null bezeichnet .Übrigens, wenn Sie einen Pfad teilen und den vollständigen Dateinamen einschließlich, aber nicht beschränkt auf die Punktverlängerung erhalten möchten, indem Sie einen Pfad mit Schrägstrichen verwenden,
String[] tokens = dir.split(".+?/(?=[^/]+$)");
Zum Beispiel:
String dir = "/foo/bar/bam/boozled"; String[] tokens = dir.split(".+?/(?=[^/]+$)"); // [ "/foo/bar/bam/" "boozled" ]
quelle
Alte Frage, aber ich benutze normalerweise diese Lösung:
import org.apache.commons.io.FilenameUtils; String fileName = "/abc/defg/file.txt"; String basename = FilenameUtils.getBaseName(fileName); String extension = FilenameUtils.getExtension(fileName); System.out.println(basename); // file System.out.println(extension); // txt (NOT ".txt" !)
quelle
Quelle: http://www.java2s.com/Code/Java/File-Input-Output/Getextensionpathandfilename.htm
eine solche Utility-Klasse:
class Filename { private String fullPath; private char pathSeparator, extensionSeparator; public Filename(String str, char sep, char ext) { fullPath = str; pathSeparator = sep; extensionSeparator = ext; } public String extension() { int dot = fullPath.lastIndexOf(extensionSeparator); return fullPath.substring(dot + 1); } public String filename() { // gets filename without extension int dot = fullPath.lastIndexOf(extensionSeparator); int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(sep + 1, dot); } public String path() { int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(0, sep); } }
Verwendung:
public class FilenameDemo { public static void main(String[] args) { final String FPATH = "/home/mem/index.html"; Filename myHomePage = new Filename(FPATH, '/', '.'); System.out.println("Extension = " + myHomePage.extension()); System.out.println("Filename = " + myHomePage.filename()); System.out.println("Path = " + myHomePage.path()); } }
quelle
basename()
wäre ein besserer Name anstelle vonfilename()
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName ()
Von http://www.xinotes.org/notes/note/774/ :
Java verfügt über integrierte Funktionen, um den Basisnamen und den Verzeichnisnamen für einen bestimmten Dateipfad abzurufen, aber die Funktionsnamen sind nicht so selbstverständlich.
import java.io.File; public class JavaFileDirNameBaseName { public static void main(String[] args) { File theFile = new File("../foo/bar/baz.txt"); System.out.println("Dirname: " + theFile.getParent()); System.out.println("Basename: " + theFile.getName()); } }
quelle
Dateierweiterungen sind ein kaputtes Konzept
Und es gibt keine zuverlässige Funktion dafür. Betrachten Sie zum Beispiel diesen Dateinamen:
Was ist die Erweiterung? DOS-Benutzer hätten den Namen bevorzugt
archive.tgz
. Manchmal sehen Sie dumme Windows-Anwendungen, die zuerst die Datei dekomprimieren (was eine.tar
Datei ergibt ), dann müssen Sie sie erneut öffnen, um den Archivinhalt zu sehen.In diesem Fall wäre ein vernünftigerer Begriff der Dateierweiterung gewesen
.tar.gz
. Darüber hinaus gibt es.tar.bz2
,.tar.xz
,.tar.lz
und.tar.lzma
Datei „Erweiterungen“ im Einsatz. Aber wie würden Sie entscheiden, ob Sie am letzten oder am vorletzten Punkt teilen möchten?Verwenden Sie stattdessen MIME-Typen.
Die Java 7-Funktion Files.probeContentType erkennt Dateitypen wahrscheinlich viel zuverlässiger als das Vertrauen in die Dateierweiterung. So ziemlich die gesamte Unix / Linux-Welt sowie Ihr Webbrowser und Smartphone tun dies bereits auf diese Weise.
quelle
File
nochPath
lassen Sie mich die Erweiterung abspalten..tar.gz
vs..tgz
nur allzu häufig auf Unix). Verwenden Sie stattdessen MIME-Typen.Files.probeContentType
anstatt sich auf den Dateinamen zu verlassen, um die richtige Erweiterung zu haben?Was ist los mit deinem Code? Eingewickelt in eine ordentliche Dienstprogrammmethode ist es in Ordnung.
Wichtiger ist, was als Trennzeichen verwendet werden soll - der erste oder letzte Punkt. Der erste ist schlecht für Dateinamen wie "setup-2.5.1.exe", der letzte ist schlecht für Dateinamen mit mehreren Erweiterungen wie "mybundle.tar.gz".
quelle
Sie können auch Java Regular Expression verwenden. String.split () verwendet den Ausdruck auch intern. Siehe http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
quelle
Vielleicht könnten Sie String # split verwenden
Um Ihren Kommentar zu beantworten:
Ich bin mir nicht sicher, ob es mehr als eine geben kann. in einem Dateinamen, aber was auch immer, auch wenn es mehr Punkte gibt, können Sie die Aufteilung verwenden. Bedenken Sie zB das:
String input = "boo.and.foo"; String[] result = input.split(".");
Dies gibt ein Array zurück, das Folgendes enthält:
{ "boo", "and", "foo" }
Sie wissen also, dass der letzte Index im Array die Erweiterung und alle anderen die Basis sind.
quelle
.
in einer Zeichenfolge herausfindenfileName.split("\\.(?=[^\\.]+$)")