gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:41:37 27 4
gpt4 key购买 nike

我们的应用程序正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com