我有一個問題來獲得給定文件名的擴展名。我收到1個文件的URL。
它可能會像在java中獲取文件擴展名
/var/www.dir/file.tar.gz OR /var/www.dir/file.exe
現在我需要分割文件的擴展名(諸如.tar.gz或.exe)從給定的URL。該URL由用戶動態給出。任何人請幫助我,如何解決這個問題
我有一個問題來獲得給定文件名的擴展名。我收到1個文件的URL。
它可能會像在java中獲取文件擴展名
/var/www.dir/file.tar.gz OR /var/www.dir/file.exe
現在我需要分割文件的擴展名(諸如.tar.gz或.exe)從給定的URL。該URL由用戶動態給出。任何人請幫助我,如何解決這個問題
這似乎是最簡單的解決方案是爲異常值創建單獨的案例(如.tar.gz),並將其餘部分視爲相同(即,在最後的.
字符後處理掉所有內容)。
其中多個.
字符的擴展是非常罕見的,您不需要一個複雜的方法來解析出你需要的東西。所以:
int length = url.length();
String extension = null;
if(url.substring(length-7).equalsIgnoreCase(".tar.gz")) {
//special case
} else {
extension = url.substring(url.lastIndexOf("."));
}
這不是像.tar.gz這樣的意思,點的數量可能會變長。我們無法確定它是多久? – Bathakarai
擴展很少包含多個'。'只是處理這些特殊情況比創建正則表達式更重要。當然,你可以假定在''開始後的所有事情。是擴展名,但如果文件名包含該字符,則會產生它自己的問題。 – asteri
雅,這是真的。我接受你的話@Jeff – Bathakarai
你可以這樣做:
String str = "/var/www.dir/file.tar.gz";
Matcher m = Pattern.compile(".*/.*?(\\..*)").matcher(str);
if (m.matches()) {
fileExtension = m.group(1);
}
嘿,這個問題可能是一個帶點的路徑,就像git倉庫一樣。例如,/my/path/to/a.git/repositry – shortstuffsushi
不,仍然適用,表達式的第一部分是_greedy_。 – Reimeus
我想我錯過了當我第一次看到帖子。唯一剩下的問題是處理沒有擴展名的文件,但我猜這不是必須在這裏處理的情況。 – shortstuffsushi
你可以使用的lastIndexOf
和indexOf
組合:
String s = "/var/www.dir/file.tar.gz";
String file = s.substring(s.lastIndexOf("/"));
String extension = file.substring(file.indexOf(".")); // .tar.gz
DEMO。
我剛剛意識到我錯誤地閱讀了你的問題。你可以收集擴展使用同樣的方法,雖然
String yourString = "/your/whole/path.ext.si.ons";
String[] pathPieces = yourString.split("/"); // [ "your", "whole", "path.ext.si.ons" ]
String lastPiece = pathPieces[pathPieces.length - 1];
String[] namePieces = lastPiece.split("."); // [ "path", "ext", "si", "ions" ]
在這一點上,第一塊很可能是你的名字,其中片的其餘部分將是擴展。然後你可以加入這些來獲得你的擴展類型。
這不是一個可怕的複雜任務,而是一個重複出現的問題。看起來像是可以由你自己快速生成的東西 - 它可以。但是您仍然應該使用現成的,經過測試的庫:Apache IO Tools,特別是FilenameUtils#getExtension。這樣可以避免令人毛骨悚然的錯誤或不一致。另外你會得到很多其他有用的,經過測試的東西。
當然在雙文件擴展的情況下,您可能需要多次使用這些方法,因爲庫無法猜測您需要擴展的級別。它是一個.gz
的文件,只有在un-gunzipping它是一個.tar
文件。
您可以使用此代碼來獲取文件擴展名
public static String getFileExtension(String filename)
{
if (filename == null) {
return null;
}
int lastUnixPos = filename.lastIndexOf('/');
int lastWindowsPos = filename.lastIndexOf('\\');
int indexOfLastSeparator = Math.max(lastUnixPos, lastWindowsPos);
int extensionPos = filename.lastIndexOf('.');
int lastSeparator = indexOfLastSeparator;
int indexOfExtension = lastSeparator > extensionPos ? -1 : extensionPos;
int index = indexOfExtension;
if (index == -1) {
return "";
} else {
return filename.substring(index + 1);
}
}
假設URL模式爲:「/somurl/blah-blah/filename.extension」。 我會建議下面的代碼片段作爲你的問題的解決方案。
String getFileExtension(String url) {
String[] urlSplit = url.split("/");
String filename = urlSplit[urlSplit.length - 1];
String[] nameSplit = filename.split("[.]");
StringBuffer fileExtension = new StringBuffer();
// to prevent appending . after extension type
if (nameSplit.length > 1) {
for (int index = 1; index < nameSplit.length; index++) {
if (index != nameSplit.length - 1)
fileExtension.append(nameSplit[index] + ".");
else
fileExtension.append(nameSplit[index]);
}
} else {
fileExtension.append(nameSplit[0]);
}
return fileExtension.toString();
}
不錯。但是,你會說這種URL類型 - 「https://scontent-frt3-2.xx.fbcdn.net/v/t1.0-0/cp0/e15/q65/p261x260/19884496_1441777802579911_6542689024155960641_n.jpg?efg=eyJpIjoidCJ9&oh = 9882051a07b89b32c9b6d4d996b2a941&oe = 5A11F44A「? –
如果一個文件被命名爲'read.me.tar.gz',你期望擴展名是'tar.gz'還是'me.tar.gz'? –