1

私たちのアプリケーションは、Commons VFSを使用してさまざまな種類のファイルを読み取ります。ファイル拡張子のマッピングを介して、VFS が提供する自動ファイル タイプ検出を使用します。

問題: VFS は、gz ファイル (つまり、名前が で終わる.gzファイル) を、GZIP ファイルではなく、通常のファイルとして誤分類します。これにより、VFS を使用して gz ファイルの (解凍された) コンテンツを読み取ることができなくなります。

私は問題を に追跡しましたorg.apache.commons.vfs2.impl.FileContentInfoFilenameFactory.create()。これは呼び出します

FileNameMap fileNameMap = URLConnection.getFileNameMap();
contentType = fileNameMap.getContentTypeFor(name);

content-types.propertiesこれにより、現在の Java インストールからファイルがロードされます。このファイル (少なくとも Windows では) には、次のマッピングが含まれています。

application/octet-stream: \
    description=Generic Binary Stream;\
    file_extensions=.saveme,.dump,.hqx,.arc,.obj,.lib,.bin,.exe,.zip,.gz    

ソース コードによると、org.apache.commons.vfs2.impl.FileTypeMapこのマッピングは、VFS が構成されたファイル拡張子マップよりも優先されます。

(a) この問題を回避するために VFS の 1 つまたは 2 つのクラスを拡張する方法、または (b) VFS が gz ファイルを正しく分類するように VFS および/または Java 自体を構成する方法を考えられる人はいますか?

4

1 に答える 1

0

getContentTypeFor次のようなクラスを作成して、メソッドをオーバーライドし、面倒なエントリFileNameMapを除外します。application/octet-stream

public static class MyFileNameMap implements FileNameMap
{
    private FileNameMap delegate = URLConnection.getFileNameMap();

    @Override
    public String getContentTypeFor( String fileName )
    {
        String contentType = delegate.getContentTypeFor( fileName );
        if( "application/octet-stream".equals( contentType ) )
        {
            // Sun's java classifies zip and gzip as application/octet-stream,
            // which VFS then uses, instead of looking at its extension
            // map for a more specific mime type
            return null;
        }
        return contentType;
    }
}

この新しいクラスを次の方法でインストールします。

URLConnection.setFileNameMap( new MyFileNameMap() );

を呼び出すとFileSystemManager.resolveFile()、VFS はgzその拡張子マップにフォールバックして、ファイルの正しいファイル タイプを選択します。

注:これは現在の JVM に対するグローバルな変更であるため、ファイルなどのためにこの MIME タイプ エントリを必要とする他のコードを使用している場合は注意してください.exe

于 2013-05-07T19:40:27.457 に答える