Java 即使文件扩展名已更改,如何识别文件类型?

Java 即使文件扩展名已更改,如何识别文件类型?,java,filesystems,file-extension,magic-numbers,Java,Filesystems,File Extension,Magic Numbers,文件按文件扩展名分类。所以我的问题是,即使文件扩展名已更改,如何识别文件类型 例如,我有一个名为myVideo.mp4的视频文件,我已将其更改为myVideo.txt。因此,如果我双击它,首选的文本编辑器将打开该文件,而不会打开确切的内容。但是,如果我在视频播放器中播放myVideo.txt,视频将毫无问题地播放 我只是想开发一个应用程序来确定文件的类型,而不检查文件扩展名,也不建议使用打开文件的软件。我想用Java开发这个应用程序。有一个名为的工具,它可以做你想要做的事情-它目前支持5033种

文件按文件扩展名分类。所以我的问题是,即使文件扩展名已更改,如何识别文件类型

例如,我有一个名为
myVideo.mp4
的视频文件,我已将其更改为
myVideo.txt
。因此,如果我双击它,首选的文本编辑器将打开该文件,而不会打开确切的内容。但是,如果我在视频播放器中播放
myVideo.txt
,视频将毫无问题地播放


我只是想开发一个应用程序来确定文件的类型,而不检查文件扩展名,也不建议使用打开文件的软件。我想用Java开发这个应用程序。

有一个名为的工具,它可以做你想要做的事情-它目前支持5033种不同的文件类型-并且可以添加新的类型。在*nix系统上,还有一个类似的命令。

嗯,这就像有一个文件格式的数据库,你不需要在应用程序中寻找扩展名就可以读取。就像Linux一样。所以,每当您打开一个文件时,您都需要检查它所属的文件格式数据库。虽然不确定它如何适用于不同的文件类型,但大多数文件都有固定的头格式,可以是zip、pdf、mpg、avi、png等。。因此,这种方法应该有效

您可以尝试一下,但它已经很老了,尽管还不成熟。最好的方法仍然是文件扩展名


但是亚当的解决方案并不像你想象的那么糟糕。您可以使用围绕命令行调用的包装器构建独立于平台的解决方案。我认为使用此方法将获得更好的结果。

以下代码片段检索有关文件类型的信息

final File file = new File("file.txt");
System.out.println("File type is: " + new MimetypesFileTypeMap().getContentType(file));

希望它能帮助您

实现这一点的最佳库之一是。它不仅读取文件头,还能够执行内容分析以检测文件类型。使用Tika非常简单,下面是一个检测文件类型的示例:

import java.net.URL;
import org.apache.tika.Tika; //Including Tika

public class TestTika {

    public static void main(String[] args) {
        Tika tika = new Tika();
        String fileType = tika.detect(new URL("http://example.com/someFile.jpg"));
        System.out.println(fileType);
    }

}

结构,幻数,元数据,字符串和正则表达式,启发式和统计分析。。。这个工具只能和它背后的规则数据库一样好

尝试DROID()来识别文件类型;Java,Net BSD许可。这是英国国家档案馆的免费项目,与Android无关。源代码可在Github和Sourceforge上获得很好


另请参见

谷歌“文件头”和“魔法数字”…TrID不是独立于平台的。我想以独立于平台的方式来做。TrID声称支持Linux,但我不能说我自己也尝试过。是的,这是真的。但我不能使用Windows中使用的相同应用程序在*nix中执行。这就是为什么我在考虑使用Java。这真的有效吗。Doc声明“这个类扩展了FileTypeMap,并通过文件扩展名提供文件的数据类型。”但是OP想要“识别文件类型,即使文件扩展名已经更改”+1 DROID实际上是一个非常令人印象深刻的库。我真不敢相信我竟然忘了。项目网站显示为不可用。我试图用纯java实现它。是的,Sourceforge页面是唯一可用的页面。