11

たとえば、次の関数を使用して、ファイルの URL からファイルの拡張子を取得したいと考えていました。

ファイル名:

Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg

ファイルの URL:

String url = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg";

関数呼び出し:

String extension = MimeTypeMap.getFileExtensionFromUrl(url);

しかし、関数呼び出しで例外が発生します。これはバグですか、それとも機能ですか?

外国語の文字 (括弧など) をそれほど多く含まないファイル名では問題なく機能します。

関数にバグがありますか?何か不足していますか?バグと機能をどのように区別すればよいですか? 関数の説明を読みましたが、正しく動作するはずです。

プロジェクトで個人的に使用していますか?信頼できそうにありません。

4

3 に答える 3

28

コードをテストしても、例外はスローされません。ただし、適切なファイル拡張子「jpg」は返されません。の使用はお勧めしませんMimeTypeMap。代わりにファイル拡張子を取得する簡単な方法は次のとおりです。

String file = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg";
String exten = "";

int i = file.lastIndexOf('.');
if (i > 0) {
    exten = file.substring(i+1);
}

なぜMimeTypeMap.getFileExtensionFromUrl(url)失敗するのですか?適切にフォーマットされた URL 文字列を期待していますが、あなたのものはそうではありません。最初に を使用してエンコードする必要がありURLEncoderます。例えば:

String url = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg";
url = URLEncoder.encode(url, "UTF-8");

これで正常に動作するはずMimeTypeMap.getFileExtensionFromUrl(url)ですが、残念ながらまだ動作していません。なんで?URLEncoderすべてのスペースを「+」記号に変更getFileExtensionFromUrlし、無効な文字と見なします。この部分、IMHOはバグです。

私の経験から、ほとんどの人はこの方法を使用しません。実際、あなたがこの質問を投稿するまで、私はそれを聞いたことがありませんでした. おそらく、ファイル拡張子を見つけるのはかなり簡単で、ほとんどの人が上で投稿したようなコードを書いているからでしょう。

于 2013-01-14T15:32:46.940 に答える
1

私は自分のプロジェクトでこれを使用していますが、ファイル名に特定の文字がない限り機能します。

私は自分で弦を分割する道を歩まないことにしました。

私はこの問題を回避しました:

String ext = MimeTypeMap.getFileExtensionFromUrl(sanitizeFileName(Uri.encode(name)));

そして、ファイル名をサニタイズするためにこのメソッドを作成しました:

public static String sanitizeFileName(String name)
{
    byte[] invalidChars = new byte[]{34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
    for(byte i : invalidChars)
    {
        name = name.replace((char)i,'_');
    }
    return name;
}

サニタイズ メソッドは、他のことにも役立ちます。

于 2014-09-30T08:21:34.523 に答える