根据其主干名称识别文件的扩展名

时间:2015-04-14 13:12:00

标签: java file

我有一个简单的问题,我很挣扎。我在目录中有几个文件,我正在阅读它们并根据它们的类型(扩展名)传递处理它们。但是,作为输入,我收到一个没有扩展名的文件路径,所以我必须自己识别该类型。

示例(文件):

files/file1.txt
files/file1.txt
files/pic1.jpg
----------------
String path = "files/file1";
String ext = FilenameUtils.getExtension(path); // this returns null

当扩展名未包含在路径中时,有没有办法识别文件类型?

3 个答案:

答案 0 :(得分:2)

你最好的选择是"自己做"通过实施FileTypeDetectors

的实例

如果有了此功能,则可以使用Files.probeContentType()返回一个字符串,该字符串将文件内容描述为MIME类型。


JDK确实提供了默认实现,但它基本上依赖于文件扩展名。如果你有一个名为foo.txt的PNG图像,默认实现将返回text/plain,其中文件实际上是image/png

这当然是错误的。


最后注意事项:如果您真正拥有的只是文件名的一部分,请使用Files.newDirectoryStream()并为其提供相应的DirectoryStream.Filter<Path>。不确定为什么你只有部分

答案 1 :(得分:1)

由于您只提供了部分文件名,因此您需要搜索以该前缀开头的文件。请注意,可能有多个匹配。

使用java.nio.file

Path prefix    = Paths.get(path);
Path directory = prefix.getParent();

try (Stream<Path> stream = Files.list(directory)) {
    stream.filter(p -> p.getFileName().startsWith(prefix.getFileName() + "."))
          .forEach(p -> System.out.printf("Found %s%n", p));
}

使用java.io

File       prefix    = new File(path);
File       directory = prefix.getParentFile();
List<File> matches   = directory.listFiles((dir, name) ->
                           name.startsWith(prefix.getName() + "."));

for (File match: matches) {
    System.out.printf("Found %s%n", match);
}

答案 2 :(得分:0)

Files.probeContentType(Path)实现了您可以使用(或扩展)的基本MIME类型查询,其内部详细信息是特定于平台的。您还可以创建一个实用程序方法来遍历一组扩展。根据您的应用,可能需要两种方法的组合。

MIME类型检查器将在JRE的不同版本实现上提供不同的结果。所以,总是有一个故障转移解决方案。

请参阅:http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#probeContentType%28java.nio.file.Path

[编辑]

这实际上没有回答所提出的问题,因为这种方法需要一个完整的,合法的Path对象来处理。如果您只获得了主干名称,并且缺少扩展名,那么您既没有可以使用的扩展名,也没有Path的有效Files名称可以使用[和probeContentType()可以,一些实现,无论如何都只使用扩展。]

如果没有指向JRE可以访问的真实磁盘文件的路径,或者如果您没有扩展名,则我不确定如何执行此操作。如果您没有某种类型的文件,您甚至无法自己打开它来尝试文件类型&#34; magic&#34;。