java - 如何配置Commons VFS自动检测gz文件

标签 java apache-commons-vfs

我们的应用程序正在使用 Commons VFS读取各种类型的文件。我们使用 VFS 提供的自动文件类型检测功能,通过其 file extension mapping .

问题:VFS 将 gz 文件(即名称以 .gz 结尾的文件)错误分类为常规文件,而不是 GZIP 文件。这阻止我们使用 VFS 读取 gz 文件的(解压缩的)内容,而无需进行一些特殊情况的手动破解。

我已将问题追溯到 org.apache.commons.vfs2.impl.FileContentInfoFilenameFactory.create(),它调用

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

这将从当前 Java 安装中加载文件 content-types.properties。该文件(至少在 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 类来解决此问题或(b)配置 VFS 和/或 Java 本身,以便 VFS 正确分类 gz 文件?

最佳答案

创建如下所示的类,以覆盖 FileNameMapgetContentTypeFor 方法并排除麻烦的 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),请务必小心文件。

关于java - 如何配置Commons VFS自动检测gz文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16427142/

相关文章:

java - 如何使 JFrame 居中?

java - apache common vfs和mercurial的集成

java - 如何使用Java查找远程Linux机器的磁盘空间

java - 使用 Apache Commons VFS 附加到文件

java - Java FTP 库 Jsch 的问题

java - 有没有办法通过Java中的VFS设置远程文件夹的权限?

java - 将文件写入默认临时目录时权限被拒绝

java - 如何通过单击鼠标左键将绿色 ToggleButton 的颜色更改为红色

java - bytebuddy 在 springboot 中使用 aop 不起作用

java - 检查 smoothScrollToPosition 何时完成