[英]Java: splitting the filename into a base and extension
有沒有比類似的更好的方法來獲取文件基名和擴展名
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
,但這里有一個變體,它只產生兩個標記(基礎和擴展):
String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
例如:
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
產量:
["test.cool.awesome", "txt"]
正則表達式告訴 Java 在任何句點之后進行拆分,然后是任意數量的非句點,然后是輸入的結尾。 只有一個周期符合這個定義(即最后一個周期)。
從技術上
正則說,這種技術被稱為零寬度正向前瞻。
順便說一句,如果您想拆分路徑並獲取完整的文件名,包括但不限於點擴展名,請使用帶正斜杠的路徑,
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());
}
}
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName()
來自http://www.xinotes.org/notes/note/774/ :
Java 有內置函數來獲取給定文件路徑的 basename 和 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
文件“擴展名”正在使用中。 但是,您將如何決定是在最后一個點還是倒數第二個點進行拆分?
Java 7 函數Files.probeContentType可能比信任文件擴展名更可靠地檢測文件類型。 幾乎所有的 Unix/Linux 世界以及您的網絡瀏覽器和智能手機都已經這樣做了。
你的代碼有什么問題? 包裹在一個整潔的實用方法中,這很好。
更重要的是使用什么作為分隔符——第一個或最后一個點。 第一個對“setup-2.5.1.exe”這樣的文件名不利,最后一個對具有多個擴展名的文件名(如“mybundle.tar.gz”)不利。
您還可以使用 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" }
所以你會知道數組中的最后一個索引是擴展名,所有其他索引都是基數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.