ファイルのベース名と拡張子を取得するためのより良い方法はありますか?
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);
ファイルのベース名と拡張子を取得するためのより良い方法はありますか?
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);
回答:
他の人が言及していることは知ってString.split
いますが、これは2つのトークン(ベースと拡張)のみを生成するバリアントです。
String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
例えば:
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
収量:
["test.cool.awesome", "txt"]
正規表現は、Javaに、任意の数の非ピリオドが続き、その後に入力の終わりが続く任意のピリオドで分割するように指示します。この定義に一致する期間は1つだけです(つまり、最後の期間)。
技術的には、この手法は、ゼロ幅のポジティブルックアヘッドと呼ばれます。
ところで、パスを分割して、ドット拡張子を含むがこれに限定されない完全なファイル名を取得する場合は、スラッシュ付きのパスを使用します。
String[] tokens = dir.split(".+?/(?=[^/]+$)");
例えば:
String dir = "/foo/bar/bam/boozled";
String[] tokens = dir.split(".+?/(?=[^/]+$)");
// [ "/foo/bar/bam/" "boozled" ]
古い質問ですが、私は通常このソリューションを使用します:
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" !)
ソース:http://www.java2s.com/Code/Java/File-Input-Output/Getextensionpathandfilename.htm
そのようなユーティリティクラス:
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);
}
}
使用法:
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());
}
}
basename()
代わりに、より適切な名前になりますfilename()
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName()
http://www.xinotes.org/notes/note/774/から:
Javaには、特定のファイルパスのベース名とdirnameを取得するための組み込み関数がありますが、関数名はそれほど自明ではありません。
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());
}
}
そして、それに対する信頼できる機能は存在しません。たとえば、次のファイル名について考えてみます。
archive.tar.gz
拡張子は何ですか?DOSユーザーは名前を好むでしょうarchive.tgz
。時には、あなたが見愚かなWindowsアプリケーションをその最初の解凍ファイル(降伏.tar
ファイル)を、その後、アーカイブの内容を見るためにそれを再度開く必要があります。
この場合、ファイル拡張子のより合理的な概念はでした.tar.gz
。そこでもある.tar.bz2
、.tar.xz
、.tar.lz
および.tar.lzma
使用中のファイル「拡張子が」。しかし、最後のドットで分割するか、最後から2番目のドットで分割するかをどのように決定しますか?
Java 7関数Files.probeContentTypeは、ファイル拡張子を信頼するよりも、ファイルタイプを検出する方がはるかに信頼性が高い可能性があります。ほぼすべてのUnix / Linuxの世界、およびWebブラウザとスマートフォンはすでにこの方法でそれを行っています。
File
もPath
私は拡張子をオフに分割してみましょうありません。
.tar.gz
対.tgz
UNIX上で、あまりにも共通)。代わりにmimeタイプを使用してください。
Files.probeContentType
正しい拡張子を持つためにファイル名に依存する代わりに使用する際の問題はどこにありますか?
Java正規表現を使用することもできます。String.split()も内部で式を使用します。http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.htmlを参照してください
たぶんあなたはString#splitを使うことができます
あなたのコメントに答えるには:
複数存在する可能性があるかどうかはわかりません。ファイル名にありますが、ドットがもっとある場合でも、分割を使用できます。たとえば、次のことを考慮してください。
String input = "boo.and.foo";
String[] result = input.split(".");
これにより、以下を含む配列が返されます。
{ "boo", "and", "foo" }
したがって、配列の最後のインデックスが拡張子であり、他のすべてのインデックスがベースであることがわかります。
.
、文字列の最後の正規表現を理解する必要があります
fileName.split("\\.(?=[^\\.]+$)")
FilenameUtils
。getBaseName(..)
とgetExtension(..)
メソッドがあります。