我们的应用程序正在使用 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 文件?
最佳答案
创建如下所示的类,以覆盖 FileNameMap
的 getContentTypeFor
方法并排除麻烦的 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/