2010-07-13 118 views
11

假設我給了一個URI,並且我想要找到返回的文件的文件擴展名,我在Java中必須做些什麼。如何確定從一個文件的文件擴展名

例如在http://www.daml.org/2001/08/baseball/baseball-ont文件是http://www.daml.org/2001/08/baseball/baseball-ont.owl

當我做

URI uri = new URI(address); 
    URL url = uri.toURL(); 
    String file = url.getFile(); 
    System.out.println(file); 

我無法看到完整的文件名與.owl擴展,只是/2001/08/baseball/baseball-ont我怎麼得到的文件擴展名是好。 ``

回答

37

首先,我要確保你知道這是不可能找出什麼樣的文件的URI鏈接太多,因爲有.jpg結尾的鏈接可能讓你訪問一個.exe文件(這是特別對於URL,由於符號鏈接和.htaccess文件,因此它是真的),因此如果你想限制允許的文件類型,如果你想要的是這樣的話,它不是一個可靠的解決方案來從URI中獲取real擴展名當然。所以,我假設你只是想知道文件基於URI的擴展名是什麼,即使這不是完全可信的;

您可以使用下面的方法從任何URI,URL或文件路徑獲取擴展名。您不必使用任何庫或擴展,因爲這是基本的Java功能。此解決方案獲取URI字符串中最後一個.(句點)符號的位置,並在句號的位置開始創建一個子字符串,並在URI字符串的末尾結束。

String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png"; 
String extension = uri.substring(uri.lastIndexOf(".")); 

此代碼示例將上述將輸出從URI的.png延伸在extension變量,注意,.(週期)被包括在擴展,如果要收集的文件擴展名,而不預先固定的週期,由一個增加的子指數,就像這樣:

String extension = uri.substring(url.lastIndexOf(".") + 1); 

使用了正則表達式這種方法(該方法的其他人使用了大量的)一個親的是,這是少了很多資源昂貴,而且少了很多重執行,同時給出相同的結果。

此外,您可能要確保網址中包含一段文字,可以使用下面的代碼來實現這一目標:

String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png"; 
if(uri.contains(".")) { 
    String extension = uri.substring(url.lastIndexOf(".")); 
} 

您可能要在功能上進一步完善,以創造一個更強大的系統。兩個示例可能是:

  • 通過檢查URI是否存在來驗證URI,或者通過確保URI的語法有效(可能使用正則表達式)來驗證URI。
  • 修剪擴展程序以去除不需要的空白區域。

我不會在這裏介紹這兩個功能的解決方案,因爲這不是第一個問到的問題。

希望這會有所幫助!

+9

如果URL在文件名或散列之後有一個問號,這將不起作用。 – 2015-07-08 14:44:50

+0

您添加的那段時間字符檢查不會做任何非常有用的事情,因爲無論如何都有一段時間在頂級域名之前。 – 2017-02-17 15:37:01

12

有兩個答案。

如果URI沒有「文件擴展名」,那麼通過文本查看或將其轉換爲File無法推斷出該文件。一般來說,URI或文件都不需要擴展。擴展名僅僅是一個文件,命名爲約定

你真正想要的是文件的媒體類型/ MIMEtype /內容類型。您可以通過做這樣的事情,以確定媒體類型:

URLConnection conn = url.connect(); 
String type = conn.getContentType(); 

然而getContentType()方法將返回null如果服務器沒有設置響應的內容類型。 (或者它可能會給你錯誤的內容類型或非特定的內容類型。)在這一點上,你需要訴諸內容類型「猜測」,我不知道這是否會給你一個足夠具體的在這種情況下鍵入。

但是如果你「知道」應該是是OWL,爲什麼不直接給它一個「.owl」擴展?

5

URLConnection.guessContentTypeFromName(url)將在第一個答案中提供MIME類型。 也許你只是想:

String extension = url.getPath().replaceFirst("^.*/[^/]*(\\.[^\\./]*|)$", "$1"); 

的正則表達式所有消耗高達最後一個斜線,接着一邊一段時間,要麼返回類似「.owl」或‘’的延伸。 (如果沒記錯)

+1

「$ 1」意味着什麼?請解釋... – artapart 2013-11-25 12:07:31

+1

@JavaRocks - 閱讀javadocs :-) – 2015-05-25 12:11:30

+0

URLConnection.guessContentTypeFromName(地址)//(字符串地址)是最佳答案imho。 – 2015-07-08 15:18:03

5

此鏈接可能有助於爲那些誰仍然有問題: How I can get the mime type of a file having its Uri?

public static String getMimeType(Context context, Uri uri) { 
    String extension; 

    //Check uri format to avoid null 
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { 
     //If scheme is a content 
     final MimeTypeMap mime = MimeTypeMap.getSingleton(); 
     extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri)); 
    } else { 
     //If scheme is a File 
     //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters. 
     extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString()); 

    } 

    return extension; 
} 
+0

不適合我 – 2018-02-08 08:15:42

0

我這樣做。

你可以用更多的驗證檢查所有文件的擴展名:

String stringUri = uri.toString(); 
String fileFormat = "png"; 

        if (stringUri.contains(".") && fileFormat.equalsIgnoreCase(stringUri.substring(stringUri.lastIndexOf(".") + 1))) { 

         // do anything 

        } else { 

         // invalid file 

        } 
1

至於其他的答案已經解釋過,你真的不知道的內容類型,而不檢查文件。但是,您可以從URL中預測文件類型。

Java 差不多作爲URL類的一部分提供此功能。 URL::getFile會智能搶URL的文件部分的方法:

final URL url = new URL("http://www.example.com/a/b/c/stuff.zip?u=1"); 
final String file = url.getFile(); // file = "https://stackoverflow.com/a/b/c/stuff.zip?u=1" 

我們可以用它來寫我們的實現:

public static Optional<String> getFileExtension(final URL url) { 

    Objects.requireNonNull(url, "url is null"); 

    final String file = url.getFile(); 

    if (file.contains(".")) { 

     final String sub = file.substring(file.lastIndexOf('.') + 1); 

     if (sub.length() == 0) { 
      return Optional.empty(); 
     } 

     if (sub.contains("?")) { 
      return Optional.of(sub.substring(0, sub.indexOf('?'))); 
     } 

     return Optional.of(sub); 
    } 

    return Optional.empty(); 
} 

此實現應處理邊緣案件正確:

assertEquals(
    Optional.of("zip"), 
    getFileExtension(new URL("http://www.example.com/stuff.zip"))); 

assertEquals(
    Optional.of("zip"), 
    getFileExtension(new URL("http://www.example.com/stuff.zip"))); 

assertEquals(
    Optional.of("zip"), 
    getFileExtension(new URL("http://www.example.com/a/b/c/stuff.zip"))); 

assertEquals(
    Optional.empty(), 
    getFileExtension(new URL("http://www.example.com"))); 

assertEquals(
    Optional.empty(), 
    getFileExtension(new URL("http://www.example.com/"))); 

assertEquals(
    Optional.empty(), 
    getFileExtension(new URL("http://www.example.com/.")));