2012-09-19 250 views
4

我有一個問題來獲得給定文件名的擴展名。我收到1個文件的URL。
它可能會像在java中獲取文件擴展名

/var/www.dir/file.tar.gz OR /var/www.dir/file.exe 

現在我需要分割文件的擴展名(諸如.tar.gz或.exe)從給定的URL。該URL由用戶動態給出。任何人請幫助我,如何解決這個問題

+0

如果一個文件被命名爲'read.me.tar.gz',你期望擴展名是'tar.gz'還是'me.tar.gz'? –

回答

0

這似乎是最簡單的解決方案是爲異常值創建單獨的案例(如.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(".")); 
} 
+0

這不是像.tar.gz這樣的意思,點的數量可能會變長。我們無法確定它是多久? – Bathakarai

+0

擴展很少包含多個'。'只是處理這些特殊情況比創建正則表達式更重要。當然,你可以假定在''開始後的所有事情。是擴展名,但如果文件名包含該字符,則會產生它自己的問題。 – asteri

+0

雅,這是真的。我接受你的話@Jeff – Bathakarai

-1

獲取文件的輸入,然後用它分裂「」作爲分隔符也許? 設置一個分隔符:

Scanner line_scanner = new Scanner(line).useDelimiter("."); 

讀取文件的URL兩次,一次爲文件名和一次延長。

+0

這將在第一次讀取時返回'/ var/www.dir/file',並在第二次讀取時返回'tar'。 – asteri

+0

然後用'if'循環匹配'tar''exe'等字符串,然後根據需要對待它們 – Azulflame

3

你可以這樣做:

String str = "/var/www.dir/file.tar.gz"; 
Matcher m = Pattern.compile(".*/.*?(\\..*)").matcher(str); 
if (m.matches()) { 
    fileExtension = m.group(1); 
} 
+0

嘿,這個問題可能是一個帶點的路徑,就像git倉庫一樣。例如,/my/path/to/a.git/repositry – shortstuffsushi

+0

不,仍然適用,表達式的第一部分是_greedy_。 – Reimeus

+0

我想我錯過了當我第一次看到帖子。唯一剩下的問題是處理沒有擴展名的文件,但我猜這不是必須在這裏處理的情況。 – shortstuffsushi

4

你可以使用的lastIndexOfindexOf組合:

String s = "/var/www.dir/file.tar.gz"; 
String file = s.substring(s.lastIndexOf("/")); 
String extension = file.substring(file.indexOf(".")); // .tar.gz 

DEMO

0

我剛剛意識到我錯誤地閱讀了你的問題。你可以收集擴展使用同樣的方法,雖然

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" ] 

在這一點上,第一塊很可能是你的名字,其中片的其餘部分將是擴展。然後你可以加入這些來獲得你的擴展類型。

7

這不是一個可怕的複雜任務,而是一個重複出現的問題。看起來像是可以由你自己快速生成的東西 - 它可以。但是您仍然應該使用現成的,經過測試的庫:Apache IO Tools,特別是FilenameUtils#getExtension。這樣可以避免令人毛骨悚然的錯誤或不一致。另外你會得到很多其他有用的,經過測試的東西。

當然在雙文件擴展的情況下,您可能需要多次使用這些方法,因爲庫無法猜測您需要擴展的級別。它是一個.gz的文件,只有在un-gunzipping它是一個.tar文件。

0

您可以使用此代碼來獲取文件擴展名

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); 
} 
} 
0

假設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(); 
} 
+0

不錯。但是,你會說這種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「? –